gpt4 book ai didi

javascript - 异步计时器事件在 Firefox 4 中同步运行 ("buggy")?

转载 作者:行者123 更新时间:2023-11-30 18:43:45 24 4
gpt4 key购买 nike

这是在 Firefox 4 (4.0.1) 中; Firefox 3 (Firefox 3.6.17)、IE 9 (9.0.8112.16421) 和 Chrome 11 (11.0.696.68) 中的警报顺序“符合预期”。

警报的预期顺序是 "Now", "Wait-End(x)", "End(x)",其中 x 是某个数字一样。

但是,观察到的顺序是“Now”、“End(0)”、“Wait-End(x)”。为什么 setTimeoutwhile 之后 不异步运行?这似乎是非常有问题,如计数器所示。 Here is the jsfiddle对于以下测试用例:

function doLater(callback) {
// if the timeout is larger than about 800ms it "works as expected"
setTimeout(callback, 1)
alert("Now")
}

var waiting = 0;
doLater(function () { alert("End(" + waiting + ")") })
var end = (+new Date) + 2000
while ((+new Date) < end) { waiting++ }
alert("Wait-End(" + waiting + ")")

如果计时器超时超过 ~800 毫秒,则会发生预期的行为。(100 毫秒和 500 毫秒的超时仍然表现出意外的顺序)。

这真的像是一个错误。


更新:这部分是海森堡。以下工作按预期进行。 Firefox 4.0.1 中的 alert 似乎将处理未决事件(何时关闭?)。 The jsfiddle和代码:

function doLater(callback) {
setTimeout(callback, 1)
console.log("Now")
}

var waiting = 0;
doLater(function () { console.log("End(" + waiting + ")") })
var end = (+new Date) + 2000
while ((+new Date) < end) { waiting++ }
console.log("Wait-End(" + waiting + ")")

有了这个新信息,Firefox 4 的警报行为是否仍然在适用的 Javascript/事件模型规范内运行?特别是,调用警报的代码仍然是“active",但效果是它暂时被事件处理抢占。

最佳答案

您的脚本在我的 Firefox 3.6.17 中有效。

我做了一些搜索...似乎 Firefox 3 在处理 alert 时实际上停止了 JavaScript 线程。然而,其他同步操作(如 XMLHttpRequest)却使用了一种称为“事件循环”的东西,这显然不会阻止其他计时器的执行。

我的猜测是 Firefox 4 现在为 alert 做了 Firefox 3 为 XMLHttpRequest 做的事情;它使用事件循环,因此,计时器在 alert 的“后面”运行。这似乎可以解释为什么它对我有效(在 FF3 中)但对你无效(在 FF4 中)。

Source for the FF3 information.

关于javascript - 异步计时器事件在 Firefox 4 中同步运行 ("buggy")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6084410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com