【问题标题】:Is there any way to wait for AJAX response and halt execution?有什么方法可以等待 AJAX 响应并停止执行?
【发布时间】:2012-09-18 20:56:10
【问题描述】:

这是我想要执行的一些代码。我想等待 AJAX 响应,这样我就可以从服务器返回一些东西。有什么方法可以实现吗?

function functABC(){
    $.ajax({
        url: 'myPage.php',
        data: {id: id},
        success: function(data) {
            return data;
        }
    });

    //Wait for AJAX (???)
}

var response = functABC();

【问题讨论】:

  • 我不明白。为什么不能使用成功回调?也许你正在寻找api.jquery.com/jQuery.when
  • 我想将数据返回到我调用函数的响应变量。但是,该函数返回 null(因为 AJAX 调用是异步的)。基本上我想知道是否可以等到AJAX调用结束才返回数据。
  • 所以api.jquery.com/jQuery.when 就是你要找的。​​span>
  • @user1691818:返回数据是一个非常糟糕的主意。而是学会用回调来思考。在传递给success的回调函数中剪切并粘贴您需要执行的任何代码。
  • 已经提供了一些好的答案。检查这个-stackoverflow.com/questions/14220321/…

标签: javascript jquery ajax


【解决方案1】:

新的,使用 jquery 的 promise 实现:

function functABC(){

  // returns a promise that can be used later. 

  return $.ajax({
    url: 'myPage.php',
    data: {id: id}
  });
}


functABC().then( response => 
  console.log(response);
);

很好读,例如here.

这并不是真正的“同步”,但我认为它实现了 OP 的意图。

旧的,(jquery 的 async 选项已被弃用):

所有 Ajax 调用都可以异步完成(使用回调函数,这将是在“成功”键之后指定的函数)或同步完成 - 有效地阻塞并等待服务器应答。 要获得同步执行,您必须指定

async: false 

就像描述的here

但是请注意,在大多数情况下异步执行(通过成功回调)就可以了。

【讨论】:

  • asyncfalse 在大多数浏览器用例中已被弃用。它可能会在较新版本的浏览器中引发异常。见xhr.spec.whatwg.org/#sync-warning(适用于xhr open方法的async参数,使用jQuery)。
  • 如果现在不推荐使用,解决方案是什么?
  • 这不是答案,因为它已弃用。答案应该是这个stackoverflow.com/questions/12615169/…
【解决方案2】:

当使用 Promise 时,它​​们可以在 Promise 链中使用。 async=false 将被弃用,因此使用 Promise 是您的最佳选择。

function functABC() {
  return new Promise(function(resolve, reject) {
    $.ajax({
      url: 'myPage.php',
      data: {id: id},
      success: function(data) {
        resolve(data) // Resolve promise and go to then()
      },
      error: function(err) {
        reject(err) // Reject the promise and go to catch()
      }
    });
  });
}

functABC().then(function(data) {
  // Run this when your request was successful
  console.log(data)
}).catch(function(err) {
  // Run this when promise was rejected via reject()
  console.log(err)
})

【讨论】:

  • async=false 被弃用,这应该被标记为答案。
  • 是的。这是要走的路。有时可能需要理解承诺,但这是做到这一点的方法。而且花一些时间学习它会更好。
【解决方案3】:

简单的答案是关闭async。但这是错误的做法。正确的答案是重新思考如何编写其余代码。

而不是这样写:

function functABC(){
    $.ajax({
        url: 'myPage.php',
        data: {id: id},
        success: function(data) {
            return data;
        }
    });
}

function foo () {
    var response = functABC();
    some_result = bar(response);
    // and other stuff and
    return some_result;
}

你应该这样写:

function functABC(callback){
    $.ajax({
        url: 'myPage.php',
        data: {id: id},
        success: callback
    });
}

function foo (callback) {
    functABC(function(data){
        var response = data;
        some_result = bar(response);
        // and other stuff and
        callback(some_result);
    })
}

也就是说,不是返回结果,而是将需要完成的代码作为回调传入。正如我所展示的,回调可以嵌套到与函数调用一样多的级别。


快速解释一下为什么我说关闭异步是错误的:

关闭异步将在等待 ajax 调用时冻结浏览器。用户不能点击任何东西,不能滚动,在最坏的情况下,如果用户内存不足,有时当用户将窗口拖出屏幕并再次拖入时,他会看到空白区域,因为浏览器被冻结并且无法重绘。对于像 IE7 这样的单线程浏览器,情况更糟:所有网站都冻结了!遇到这种情况的用户可能会认为您的网站有问题。如果您真的不想异步执行,那么只需在后端进行处理并刷新整个页面。至少感觉不会有问题。

【讨论】:

    【解决方案4】:

    试试这个代码。它对我有用。

     function getInvoiceID(url, invoiceId) {
        return $.ajax({
            type: 'POST',
            url: url,
            data: { invoiceId: invoiceId },
            async: false,
        });
    }
    function isInvoiceIdExists(url, invoiceId) {
        $.when(getInvoiceID(url, invoiceId)).done(function (data) {
            if (!data) {
    
            }
        });
    }
    

    【讨论】:

      【解决方案5】:

      使用async:false 属性以及url 和数据。这将有助于立即执行 ajax 调用,您可以从服务器获取和使用数据。

      function functABC(){
          $.ajax({
              url: 'myPage.php',
              data: {id: id},
              async:false
              success: function(data) {
                  return data;
              }
          });
      }
      

      【讨论】:

      • "请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。"还“不推荐使用 jqXHR;您必须使用完整/成功/错误回调。
      【解决方案6】:

      方法一:

      function functABC(){
          $.ajax({
              url: 'myPage.php',
              data: {id: id},
              success: function(data) {
                  return data;
              },
              complete: function(){
                    // do the job here
               }
          });
      }
      
      var response = functABC();
      

      方法二

      function functABC(){
          $.ajax({
              url: 'myPage.php',
              data: {id: id},
              async: false,
              success: function(data) {
                  return data;
              }        
          });
      
         // do the job here
      }
      

      【讨论】:

      • 如果函数返回数据是否意味着该函数在 ajax 完成之前不会返回?我的理解是这样不行,见方法一,会立即返回
      猜你喜欢
      • 2017-05-21
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 2021-12-01
      • 2013-10-21
      • 2015-01-28
      相关资源
      最近更新 更多