【问题标题】:What happens if an alert window is shown during an ajax call?如果在 ajax 调用期间显示警报窗口会发生什么?
【发布时间】:2014-05-22 08:19:02
【问题描述】:

我只是想知道如果在执行 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 调用/响应会发生什么。

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

【问题讨论】:

  • +1 好问题。我确实使用警报作为穷人的断点,但是从来没有遇到过问题.. 我不记得在单击 OK 恢复脚本之前等待的时间比常规连接超时时间长.. 我 认为浏览器(被视为 javascript 引擎和布局引擎的“包装器”/“驱动程序”)将/应该继续运行并停止 javascript 引擎,这样 ajax 数据就会排队等待进一步执行。但这不是一个正确的(参考和现实生活)答案..
  • 我也使用警报来向用户提示消息.. 我认为这不是一个很好的解决方案:(
  • 旁注,总是可以覆盖window.alert(在原型设计期间将它们用作模型消息/断点之后)以(驱动)自定义函数。
  • 没想到……不错。
  • 警报与需要很长时间才能运行的函数没有什么不同。想一想如果:1. ajax 调用开始,2. ajax 调用之后,立即调用very_time_sumption_function,3. ajax 调用在very_time_sumption_function 完成之前返回数据,(现在怎么办?) 4.very_time_sumption_function 完成,5. 现在怎么办?现在您看到警报与否根本没有任何区别。

标签: javascript ajax single-threaded


【解决方案1】:

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

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

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

Here is a working example,请注意在警报关闭之前数据不会写入控制台。

需要注意的另一点是,在警报关闭后,脚本将继续执行函数的其余部分(紧跟在alert 之后的代码)处理 AJAX 响应之前。 This helps demonstrate what I mean

【讨论】:

  • 这是一个很好的答案,另见stackoverflow.com/questions/598436/…。需要了解的重要一点是,如果在 AJAX 请求启动后调用警报,它不会阻止该事件(请求)的完成,但其事件处理程序的处理将等到警报关闭。
  • @AD7six:你在干什么?
  • @AD7six:为什么不呢? What about this 显示它在警报之前开始
  • 如果您从上一个示例中删除警报,脚本仍将在 success cb 之前的警报之后立即运行代码。我认为代码将遵循已建立的事件队列代码已启动,不关心警报
  • @BeNdErR:哦,是的,当然,我并不是说alert 导致代码首先运行,只是想说明您应该期望函数在响应之前完成被处理,以防您可能依赖于首先处理的响应
【解决方案2】:

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

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

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

【讨论】:

  • 响应连接会保持打开并等待警报关闭吗?
  • 如果管道衬里打开了。正如我在回答“HTTP请求将继续运行并在后台处理。”中所说,如果响应/请求的正常行为是在收到响应时关闭连接,那么连接将被关闭。
  • @Quentin,这就是我的怀疑。我确实想知道.. 是否有一些规范/rfc 需要这种行为(因此可以安全地得出结论,任何合理的浏览器都会这样做)?
  • XMLHttpRequest 是一个带有 JS 接口的原生控件。它不依赖于 JS 事件循环(除了与 JS 通信,这就是为什么这样做是事件驱动的)
  • @BeNdErR 需要理解的重要一点是,即使 Javascript 是单线程的,浏览器本身也不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 2022-11-04
  • 1970-01-01
相关资源
最近更新 更多