这是一个基本的Javascript问题,即使它涉及一些Chrome扩展API。
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if (changeInfo.status == 'complete') {
//complete may fire multiple times per page update
var timer = 0, interval;
console.log(changeInfo.status);
clearInterval(interval);
interval = setInterval(function() {
if (timer == 5) {
console.log('here');
clearInterval(interval);
}
timer++;
}, 1000);
}
});
我认为我现在所有的剧本都是延迟一切。我想要它做的是每次“完整”状态发生时,我想检查5秒钟,然后记录“在这里”。如果另一个'完整'发射,我想摆脱以前的计时器并开始一个新计时器。基本上等到所有'完成'被解雇...我需要帮助修复我的间隔逻辑......
答案 0 :(得分:2)
您必须在函数范围之外声明timer
和interval
,否则它将在该范围内声明一个新的,并且您的clearInterval无法清除之前的间隔回调。
编辑:感谢stdob--,现在将变量改为外部以坚持eventTarget,因此不再需要在注册事件之前声明variables
。
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if (changeInfo.status == 'complete') {
//complete may fire multiple times per page update
console.log(changeInfo.status);
// Clear prev counter, if exist.
if (this.interval != null) {
clearInterval(this.interval);
}
// init timer
this.timer = 0;
this.interval = setInterval(function() {
if (this.timer == 5) {
console.log('here');
clearInterval(this.interval);
this.interval = null;
}
this.timer++;
}.bind(this), 1000); // Important to .bind(this) so that context will remain consistent.
}
});
现在每个interval
和timer
都指向同一个目标。
或者,如果您不关心每一秒发生的事情,为什么不使用setTimeout
:
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if (changeInfo.status == 'complete') {
console.log(changeInfo.status);
if (this.timeout != null) {
clearTimeout(this.timeout);
}
this.timeout = setTimeout(function() {
console.log("here");
this.timeout = null;
}.bind(this), 5000);
}
});