【问题标题】:Execution Affecting Already Set Timeouts影响已设置超时的执行
【发布时间】:2014-01-11 17:00:26
【问题描述】:

我在 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' 和 'c' 不运行的相同情况下,this.liveSyncNow 的超时也不运行。

从测试看来,当这个函数运行时,之前在其中创建的所有超时都会被取消。 'a' 超时运行的原因是在创建它的调用和下一个调用之间存在 200 毫秒的间隙。

编辑

这至少发生在 Chrome 和 Firefox 中。

编辑 2

这是一个更简单的问题示例。这是 Backbone 模型定义的一部分(尽管您不必担心)。这实际上是整个功能。

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

setInterval 运行了 3 次(“test”在控制台中出现了 3 次)然后就停止了。

【问题讨论】:

  • 无法重现,请添加一个完整的示例来演示该问题。
  • 可能setTimeout 方法正在修改。我的意思是这样的window.setTimeout = function() {}
  • @Zub 我确实考虑过。我做了console.log(setTimeout),它没有改变[本机代码]。
  • 由于clearTimeout 将第一个参数作为整数(setTimeout 调用的数量),也许您通过在其他地方传递错误的整数而意外清除了setTimeout
  • 尝试在页面上的任何其他脚本之前写window.clearTimeout = function() {}。在这种情况下它将如何表现?

标签: javascript timeout settimeout


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-14
    • 2016-02-26
    • 2014-05-03
    • 2021-12-03
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多