Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Значение переменной присваивается только со второй попытки (https://javascript.ru/forum/misc/60966-znachenie-peremennojj-prisvaivaetsya-tolko-so-vtorojj-popytki.html)

thesun 29.01.2016 10:54

Значение переменной присваивается только со второй попытки
 
Добрый день. Помогите разобраться.
На сайте стоит калькулятор стоимости. По нажатию запускается процедура проверки из которой стартует процедура обсчета. Есть несколько полей списков. На основании выбранного пункта делается запрос к базе для получения переменной участвующей в расчете. Проблема в том что правильное значение получается только при повторном запуске функции.
function raschet_zakaza(){
			 
			 	Perimetr();  // расчитываем периметр и площадь
				// проверяем выбранали постпечатная обработка и какие виды
					// ламинирование start
					   if(($('#laminirovanieYes').is(":checked")) && ($('#typeMaterLam').val().length) ) { 
			 														
								
								// создаем запрос к БД посредством обращения к файлу all_base.php 
								
								$.post("all_base.php",{"var1":"2","var2":temp1,"var3":param}, function(data){
									    a1=data;
										// alert("первое окно"+a1);
										 klsum=Math.round(a1*squre*tir*100)/100;
									   })
									   	// alert("второе окно"+a1);
									    // a1= parseFloat($('#klperemen').text());  // рублей за метр
										 
										 // alert("первое окно"+a1);								  
							  
					}
						else { 								
								alert('меняем');
								klsum=0;
							}
					// ламинирование end
				summa=Math.round((kmsum+klsum+knsum+kgsum+kpsum+krsum)*100)/100;
				$('#price').text(summa);
			   $('#price1').html(perimetr+'</br>ширина -'+shirina+'</br>высота -'+visota+'</br>площадь'+squre+'</br>ламинирование = '+klsum+'</br> накатка = '+knsum+'</br>'+'тираж='+tir+'</br> клей='+kgsum+'</br> подрезка='+kpsum+'</br> рамка='+krsum+'</br> temp1='+temp1+'</br> A1='+a1);

Все работает если получение переменной вешать на событие изменения для списка, но это неудобно в целом.
И еще одна особенность.
Если раскомментировать строки
alert("первое окно"+a1);
и
alert("второе окно"+a1);
то происходит следущее:
первое окно будет показывать что переменная считалась из БД
второе окно будет показывать предыдущее значение переменной
значение же на сайте будет правильным. если их закомментировать обратно то на сайте правильное значение можно получить только два раза запустив процедуру расчета.

Может кто нибудь знает в чем проблема.
Спасибо.

laimas 29.01.2016 11:02

$.post("all_base.php",{"var1":"2","var2":temp1,"va r3" : param}, function(data){...}) это асинхронное действие по отношению к остальной части кода функции.

thesun 29.01.2016 12:24

Т.е. может не успевать?

thesun 29.01.2016 12:44

Вот только не понятно почему он в первом alert выдает правильную величину из БД. (т.е. он получил данные и записал в переменную значение), а потом он опять берет туже переменную с прежним значением.

laimas 29.01.2016 12:48

расчет summa=Math.round((kmsum+klsum+knsum+kgsum+kpsum+kr sum)*100)/100; не обязан дожидаться ответа сервера, он сам по себе и сразу будет выполнен, а $.post сам по себе. Расчеты нужно производить в методе $.post() после ответа сервера.

thesun 29.01.2016 13:13

А в такой ситуации можно использовать синхронный запрос?

рони 29.01.2016 13:19

Цитата:

Сообщение от thesun
А в такой ситуации можно использовать синхронный запрос?

можно, если хотите потерять клиентов, лучше осилить логику асинхронной работы -- клиент никуда не денется если подождёт пару мгновений при живом браузере, но но когда браузер зависает на каком-то сайте, ни на чего не реагируя это мало кому может понравится.

laimas 29.01.2016 13:28

Цитата:

Сообщение от thesun
А в такой ситуации можно использовать синхронный запрос?

А зачем вам синхронный, если всего то надо выполнять расчеты после ответа сервера, более того, их нет смысла делать, пока не получен ответ. Вы же часть считаете при получении ответа, а часть сама по себе, исправляйте логику.

thesun 29.01.2016 14:04

Большое спасибо. Подумаем. Просто таких полей , которые в случае выбора нужно обратиться к БД а потом все объединить несколько. Это все и осложняет.
Спасибо.

laimas 29.01.2016 20:52

Цитата:

Сообщение от thesun
Просто таких полей , которые в случае выбора нужно обратиться к БД а потом все объединить несколько. Это все и осложняет.

Ну так или изменяйте логику, или же если такие неимоверные трудности на клиенте сделать, считайте сразу на сервере.


Часовой пояс GMT +3, время: 12:47.