Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.01.2016, 10:54
Новичок на форуме
Отправить личное сообщение для thesun Посмотреть профиль Найти все сообщения от thesun
 
Регистрация: 29.01.2016
Сообщений: 5

Значение переменной присваивается только со второй попытки
Добрый день. Помогите разобраться.
На сайте стоит калькулятор стоимости. По нажатию запускается процедура проверки из которой стартует процедура обсчета. Есть несколько полей списков. На основании выбранного пункта делается запрос к базе для получения переменной участвующей в расчете. Проблема в том что правильное значение получается только при повторном запуске функции.
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);
то происходит следущее:
первое окно будет показывать что переменная считалась из БД
второе окно будет показывать предыдущее значение переменной
значение же на сайте будет правильным. если их закомментировать обратно то на сайте правильное значение можно получить только два раза запустив процедуру расчета.

Может кто нибудь знает в чем проблема.
Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 29.01.2016, 11:02
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

$.post("all_base.php",{"var1":"2","var2":temp1,"va r3" : param}, function(data){...}) это асинхронное действие по отношению к остальной части кода функции.
Ответить с цитированием
  #3 (permalink)  
Старый 29.01.2016, 12:24
Новичок на форуме
Отправить личное сообщение для thesun Посмотреть профиль Найти все сообщения от thesun
 
Регистрация: 29.01.2016
Сообщений: 5

Т.е. может не успевать?
Ответить с цитированием
  #4 (permalink)  
Старый 29.01.2016, 12:44
Новичок на форуме
Отправить личное сообщение для thesun Посмотреть профиль Найти все сообщения от thesun
 
Регистрация: 29.01.2016
Сообщений: 5

Вот только не понятно почему он в первом alert выдает правильную величину из БД. (т.е. он получил данные и записал в переменную значение), а потом он опять берет туже переменную с прежним значением.
Ответить с цитированием
  #5 (permalink)  
Старый 29.01.2016, 12:48
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

расчет summa=Math.round((kmsum+klsum+knsum+kgsum+kpsum+kr sum)*100)/100; не обязан дожидаться ответа сервера, он сам по себе и сразу будет выполнен, а $.post сам по себе. Расчеты нужно производить в методе $.post() после ответа сервера.
Ответить с цитированием
  #6 (permalink)  
Старый 29.01.2016, 13:13
Новичок на форуме
Отправить личное сообщение для thesun Посмотреть профиль Найти все сообщения от thesun
 
Регистрация: 29.01.2016
Сообщений: 5

А в такой ситуации можно использовать синхронный запрос?
Ответить с цитированием
  #7 (permalink)  
Старый 29.01.2016, 13:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от thesun
А в такой ситуации можно использовать синхронный запрос?
можно, если хотите потерять клиентов, лучше осилить логику асинхронной работы -- клиент никуда не денется если подождёт пару мгновений при живом браузере, но но когда браузер зависает на каком-то сайте, ни на чего не реагируя это мало кому может понравится.
Ответить с цитированием
  #8 (permalink)  
Старый 29.01.2016, 13:28
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от thesun
А в такой ситуации можно использовать синхронный запрос?
А зачем вам синхронный, если всего то надо выполнять расчеты после ответа сервера, более того, их нет смысла делать, пока не получен ответ. Вы же часть считаете при получении ответа, а часть сама по себе, исправляйте логику.
Ответить с цитированием
  #9 (permalink)  
Старый 29.01.2016, 14:04
Новичок на форуме
Отправить личное сообщение для thesun Посмотреть профиль Найти все сообщения от thesun
 
Регистрация: 29.01.2016
Сообщений: 5

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

Последний раз редактировалось thesun, 29.01.2016 в 15:00.
Ответить с цитированием
  #10 (permalink)  
Старый 29.01.2016, 20:52
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Значение переменной для задания имени InfoDusha Общие вопросы Javascript 6 29.12.2014 06:17
Как сделать так, чтобы значение переменной не возвращалось на исходное значение? E}|{uk Общие вопросы Javascript 1 21.12.2014 15:26
Выводить значение раньше переменных Гробовщик Общие вопросы Javascript 11 10.09.2013 08:42
Значение переменной, как имя для другой переменной Kosty@n Общие вопросы Javascript 2 15.12.2012 22:58
Значение переменной salex009 jQuery 1 05.12.2011 16:55