【发布时间】: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