52

我只是想知道如果在执行 ajax 调用时会在浏览器窗口中向用户提示警报会发生什么。

例如,假设我有一个 ajax 调用

$.ajax({
    url: ...,
    type: GET/POST,
    ...
    success: function(data){
        console.log(data);
    },
    error: ...
});

这需要很长时间才能完成(10 秒)。执行调用时,会抛出一个简单的 javascript 警报

alert("hello!");

例如,如果:

  1. ajax 调用开始
  2. ajax调用获取数据
  3. 显示警报
  4. ajax 调用返回数据(警报窗口仍然打开!)

知道 JS 是单线程的,我知道脚本执行将停止,我只是想知道如果警报窗口没有“及时”关闭,ajax 调用/响应会发生什么。

我希望我足够清楚,这不是一个“虚拟”问题。谢谢

4

2 回答 2

60

这并不难尝试看到......但答案是警报将优先处理并阻止执行流程。

关闭警报后,并假设 AJAX 请求在警报打开时已完成,则将success处理函数(或error函数)。

请注意,在显示警报时 AJAX 请求将继续运行(因此在警报打开时可以处理长时间运行的 AJAX),但只是您的脚本在警报关闭之前无法继续处理请求。

这是一个工作示例,请注意在警报关闭之前数据不会写入控制台。

需要注意的另一点是,在警报关闭后,脚本将在处理 AJAX 响应之前alert继续执行函数的其余部分(紧接在 之后的代码) 。这有助于证明我的意思

于 2014-05-22T08:25:08.197 回答
11

HTTP 请求将继续在后台运行和处理。

当 JS 事件循环空闲时,readystatechange 处理程序将触发。

一些中间就绪状态可能会被跳过,因为在该状态为真时事件循环很忙。

于 2014-05-22T08:26:19.850 回答