Javascript一直等到最后一个事件在回调中被触发,然后继续

时间:2015-07-05 18:20:07

标签: javascript setinterval

这是一个基本的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秒钟,然后记录“在这里”。如果另一个'完整'发射,我想摆脱以前的计时器并开始一个新计时器。基本上等到所有'完成'被解雇...我需要帮助修复我的间隔逻辑......

1 个答案:

答案 0 :(得分:2)

您必须在函数范围之外声明timerinterval,否则它将在该范围内声明一个新的,并且您的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.
    }
});

现在每个intervaltimer都指向同一个目标。

或者,如果您不关心每一秒发生的事情,为什么不使用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);
    }
});