【问题标题】:JavaScript - finish execution before handling ajax callbackJavaScript - 在处理 ajax 回调之前完成执行
【发布时间】:2013-07-19 01:48:03
【问题描述】:

当使用 jQUery 进行 AJAX 调用时,如果响应在 $.ajax() 执行后的下一行 JavaScript 之前返回到客户端,浏览器是否会在调用 AJAX 回调函数之前继续执行脚本,还是会立即暂停执行并跳转到回调函数?例如:

function MyAJAXFunction() {

    // Make AJAX call
    $.ajax({
        url: "/api/...",
        success: function () {
            alert("AJAX Callback");
        }
    });

    // Do lots of work

    alert("After lots of work");

}

假设 AJAX 调用会非常快而“大量工作”会非常慢,哪些警报将首先执行?

我正在尝试在执行 AJAX 回调所依赖的慢速任务之前启动 AJAX 调用,以便这两个操作是并行的。但是,我仍然需要保证 AJAX 回调将第二次执行。我意识到这也可以使用 jQuery Differed 和 Promise 对象来完成,但我宁愿避免使用这些。

【问题讨论】:

  • 您是否从 ajax 调用中获取数据?

标签: javascript jquery ajax performance asynchronous


【解决方案1】:

这里的关键概念是 Javascript 如何在浏览器中以单线程方式执行。浏览器维护一个事件队列,其中新事件(例如接收 AJAX 调用的响应)在发生时排队。浏览器还运行一个单线程事件循环,其职责是

  1. 继续寻找活动。
  2. 在事件发生时触发事件处理程序。

但是,由于它是全单线程循环,如果一个函数正在运行,下一个事件的处理函数只有在当前函数完全完成后才会被拾取。因此,无论响应何时到来,您在 AJAX 响应处理程序中的警报将始终显示在主函数中的警报之后。

【讨论】:

  • 我不同意上面@adeneo 的回答。这当然不是真的。
  • 我也不同意我的评论,我想我理解错了!如果“大量工作”阻塞线程,成功回调将添加到队列底部,当然最后执行。我不会在生产代码中打赌,但这是它应该表现的方式。
猜你喜欢
  • 1970-01-01
  • 2013-01-08
  • 2017-05-24
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多