Синхронный успешный вызов 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 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;
    }

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

Ответ 1

Вам нужно установить 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;
}

см. здесь для деталей

Ответ 2

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

Ответ 3

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

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

Затем я вызываю эту функцию следующим образом:

  getData(function(data){
    console.log(data); //do something 
  });