Ajax JQuery синхронный обратный вызов успеха

У меня есть эта функция, которая делает вызов AJAX. Я описываю проблему в последнем фрагменте комментариев к коду.

    function doop(){
            var that = this;
            var theold = "theold";
            var thenew = "thenew";

            $.ajax({
                    url: 'doop.php',
                    type: 'POST',
                    data: 'before=' + theold + '&after=' + thenew,
                    success: function(resp) {
                            if(resp == 1) {
                                    $(that).siblings('.theold').html(thenew);
                            }
                    }
            });

            // I have some code here (out of the ajax) that **further** changes 
            // the .theold's html beyond what it was changed inside ajax success
            // but the change depends on whether the resp (inside the success 
            // function) returned 1 or not, so this code out here depends on the ajax
            // so it looks like I have to turn this ajax call into a sync ajax

            return false;
    }

Исходя из проблемы, описанной в комментариях к коду, какие изменения лучше всего подходят для этой ситуации?

3 ответа

Решение

Вам нужно установить async: false для синхронных запросов, таких как:

function doop(){
        var that = this;
        var theold = $(this).siblings('.theold').html();
        var thenew = $(this).siblings('.thenew').val();

        $.ajax({
                async: false,
                url: 'doop.php',
                type: 'POST',
                data: 'before=' + theold + '&after=' + thenew,
                success: function(resp) {
                        if(resp == 1) {
                                $(that).siblings('.theold').html(thenew);
                        }
                }
        });

        // some other code

        return false;
}

смотрите здесь для деталей

Либо установите вызов Ajax в синхронный режим, как указала Стефита, либо просто перенесите свой код в обратный вызов успеха. Почему ты не можешь сделать это? Даже если это еще один вызов Ajax, это все же можно сделать - вы можете вкладывать их. С информацией, предоставленной вами до сих пор (я не вижу проблемный код, или у меня недостаточно знаний о вашем проекте), я не вижу проблемы, на самом деле.

Я предпочитаю использовать обратный вызов для выполнения этой работы, потому что он достигает точно такого же результата, фактически не делая его синхронным. Я использую success:callback, а затем передаю обратный вызов в качестве параметра.

 function getData(callback) {
      $.ajax({
          url: 'register/getData',
          data: "",
          dataType: 'json',
          success: callback
      });
  }

Затем я вызываю эту функцию так:

  getData(function(data){
    console.log(data); //do something 
  });
Другие вопросы по тегам