JavaScript - 在处理 ajax 回调之前完成执行

标签 javascript jquery ajax performance asynchronous

当使用 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 对象来完成,但我宁愿避免使用它们。

最佳答案

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

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

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

关于JavaScript - 在处理 ajax 回调之前完成执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17736879/

相关文章:

javascript - 为所有事件类型附加一个处理程序

javascript - 如何将这个动态创建的 3D 对象置于其父对象的中心?

javascript - 其余语法在 Chrome 49 中不起作用

javascript - 如何在弹出脚本和内容脚本之间发送消息

javascript - 每 1 分钟显示和隐藏 div

javascript - 自动循环播放音频

javascript - 如何在 javascript 中更新 HTML 正文参数?

ajax - Firefox HTTP 连接在阻塞阶段花费大量时间

javascript - 为什么我的 AJAX 调用成功函数没有触发 Java 脚本警报?

javascript - 如果 XMLHttpRequest 对象被删除和/或不包含任何值,因为它也被设置为 null,AJAX 将如何做?