Вернуть false при условии обратного вызова jQuery post - PullRequest
1 голос
/ 03 января 2012

У меня есть довольно сложная функция, которая выполняет пару сообщений AJAX при отправке формы для проверки значений.В зависимости от значений, возвращаемых из POST, отправка должна либо работать, либо завершаться с ошибкой.Я думал, что это можно сделать, используя глобальное логическое значение и устанавливая его значение равным true или false во всей функции, затем проверяя в конце, было ли логическое значение изменено на «true», и, если это так, вызывает «return false;».

Это терпит неудачу, хотя.Я прочитал об этом, и я думаю, что это потому, что вызов AJAX является асинхронным, поэтому код не выполняется последовательно.

Мой код выглядит так:

  $('.to-step-3').click(function(){
var shape = '';
blnError = false;
$.post('/base/RoomBuilder/GetRoomShape.aspx', function(data) {
  if(data.substring(0,5) == 'Error'){
    alert(data);
    blnError = true;
  }else{
    shape = data;

    $.post('/base/RoomBuilder/GetRoomDimensions.aspx', function(data2) {
      if(data2.substring(0,5) == 'Error'){
        alert(data2);
        blnError = true;
      }else{
        var arrDims = data2.split('_');
        var l =  arrDims[0];
        var w =  arrDims[1];
        var sl = arrDims[2];
        var ll = arrDims[3];
        var sw = arrDims[4];
        var lw = arrDims[5];
        var failMessage = 'Please enter all required dimensions to build your room';

        switch(shape) {
          case 'square':
            if(!(notNullOrEmpty(l))){
              alert(failMessage);
              blnError = true;
            }
          break;
          case'rectangle':
            if(!(notNullOrEmpty(l)) || !(notNullOrEmpty(w))){
              alert(failMessage);
              blnError = true;
            }
          break;
          case'lshaped':
            if(!(notNullOrEmpty(sl)) || !(notNullOrEmpty(ll)) || !(notNullOrEmpty(sw)) || !(notNullOrEmpty(lw))){
              alert(failMessage);
              blnError = true;
            }
          break;
          case'lshapedalt':
            if(!(notNullOrEmpty(sl)) || !(notNullOrEmpty(ll)) || !(notNullOrEmpty(sw)) || !(notNullOrEmpty(lw))){
              alert(failMessage);
              blnError = true;
            }
          break;
        }
      }
    });


  }
});

if(blnError == true){
  return false;
}else{
  return true;
}

});

Я нашелпример чего-то похожего jquery - вернуть значение из функции обратного вызова (в пост-запросе) в функцию, находящуюся внутри? , но я пытаюсь разобраться в этом в контексте того, что мне нужно сделать (яПо общему признанию, я не очень хорош в Javascript!)

Может ли кто-нибудь указать мне правильное направление здесь, поскольку я слишком долго смотрел на это!Спасибо всем.

Ответы [ 2 ]

1 голос
/ 03 января 2012

jQuery post по своей природе асинхронный, поэтому до получения ответа ajax условие if уже выполнено.Если вы хотите заставить выполнение ждать до получения ответа ajax, вы можете использовать jQuery ajax, установив для свойства async значение false.Попробуйте это

$.ajax({
   url: '/base/RoomBuilder/GetRoomDimensions.aspx',
   async: false,
   type: 'post',
   success: function(){
       //Your logic here
   }
});

//Now check the condition here
if(blnError == true){
  return false;
}else{
  return true;
}
0 голосов
/ 03 января 2012

Самый простой способ решить вашу проблему - просто сделать синхронный вызов,

$.ajaxSetup({async: false});

$.post(..);

$.ajaxSetup({async: true});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...