影响已设置超时的执行



我在Javascript方面很有经验,但我在开发web应用程序时遇到了一个奇怪的问题,因为脚本没有正常运行。奇怪的是(事实上,令人费解的是),当我使用离线开发副本或登录后,我没有遇到这个问题。然而,当用户已经登录并刷新页面时,他们却遇到了这个问题。

以下是受影响的方法(这就是整个过程):

_setLiveSyncTimeout: function (firstTestCall) {
if (firstTestCall) {
console.log('set next')
window.setTimeout(function () {
console.log(200, 'a');
window.setTimeout(function () {
console.log(400, 'b');
}, 200);
}, 200);
window.setTimeout(function () {
console.log(400, 'c');
}, 400);
}
this._liveSyncTimeout = setTimeout(_(this.liveSyncNow).bind(this), this._liveSyncPeriod);
}

我注意到this.liveSyncNow似乎并没有在每次我期望的时候都被调用,所以我在上面的if语句中添加了调试。奇怪的是,当您传入true时,第一个超时('a')将运行,但是'b'和'c'不会。由于在这些情况下不存储setTimeout的结果,因此实际上不可能取消它们,但由于没有明显的原因,它们根本不运行。在"b"one_answers"c"不运行的相同情况下,this.liveSyncNow的超时也不运行。

从测试中可以看出,当这个函数运行时,以前在其中创建的所有超时都会被取消。"a"超时运行的原因是,创建它的调用与下一个调用之间有200ms的间隔。

编辑

至少在Chrome和Firefox中会出现这种情况。

编辑2

下面是一个更简单的例子。这是骨干模型定义的一部分(不过您不需要担心)。这就是整个功能。

initialize: function () {
var a = setInterval(function () {
console.log('test')
}, 50);
}

setInterval运行三次("测试"在控制台中出现三次),然后停止。

我遇到这个问题(不足为奇),因为一段完全无关的代码错误地取消了我的超时。发生这种情况是因为我使用了setTimeout的修改版本,它返回了自己的增量分配整数,但我没有使用正确的clearTimeout修改版本,而是使用了原始的window.clearTimeout。结果,我的好计时器被错误地取消了。

我发现了这个问题,并通过覆盖clearTimeout并找出谁调用了它、何时调用以及使用了什么id来跟踪这段不可靠的代码。

我试图通过在我修改的setTimeout中递减分配ID来防止这种情况在未来发生,低于0。

相关内容

  • 没有找到相关文章

最新更新