Javascript 影响已设置超时的执行

Javascript 影响已设置超时的执行,javascript,timeout,settimeout,Javascript,Timeout,Settimeout,我在Javascript方面很有经验,但在开发web应用程序时遇到了一个奇怪的问题,因为脚本的行为不符合它的要求。奇怪的是,令人费解的是,事实上,我在使用离线开发副本或登录后没有遇到这个问题。但是,当用户已经登录并刷新页面时,他们会遇到此问题 以下是受影响的方法,这就是整个过程: _setLiveSyncTimeout: function (firstTestCall) { if (firstTestCall) { console.log('set next')

我在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

下面是一个更简单的例子。这是主干模型定义的一部分,但您不必担心这一点。这就是整个功能

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

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

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

我发现了这个问题,通过覆盖clearTimeout并找出谁、何时、用什么id调用了它,从而找到了这段不可靠的代码


我已尝试通过在Moded setTimeout decrementally中分配ID来防止将来发生这种情况,该ID低于0。

无法复制,请添加一个完整的示例来演示此问题。可能正在修改setTimeout方法。我的意思是类似于WiDOW.SETTIMEOUT=函数{}{Zub,我确实这么认为。我执行了console.logsetTimeout,但它没有更改[native code]。由于clearTimeout将第一个参数作为setTimeout调用的整数,可能您在其他地方传递了错误的整数,从而意外地清除了setTimeout?请尝试在页面上的任何其他脚本之前写入window.clearTimeout=函数{}。在这种情况下,它将如何表现?