2013-02-19 134 views
1

有什麼方法可以查看當前正在運行的超時和/或使用setTimeout或setInterval創建的時間間隔嗎?尋找剩餘setTimeouts和setInterval

由於每一個返回一個ID,有沒有辦法在開發人員控制檯中查看當前的ID?這會幫助我在應用程序中發現「泄漏」。

我能想到現在要做到這一點的唯一方法是創建我的setInterval/setTimeout的調用的包裝。或者覆蓋窗口中的內置窗口(即window.setTimeout=function()),然後讓對象圖保持跟蹤。

+0

我認爲一個更好的方法來找到造成的setTimeout「泄漏」/Interval將在JS堆快照的單獨部分中顯示它們,而不是在開發人員控制檯中提供它們的列表。 – 2013-02-22 06:43:49

回答

1

基於this answer

for (var i = 1; i < 99999; i++){ 
    window.clearInterval(i); 
    window.clearTimeout(i); 
} 

希望這有助於!

+0

@ K2xL:是的,基於這裏給出的鏈接,可能會嘗試重寫setTimeout/setInterval,然後如果運行時間過長,則使用行#'(new Error).lineNumber'觸發錯誤 – 2013-02-19 23:04:16

1

我剛剛爲您寫的代碼覆蓋了setTimeoutclearTimeout函數,並創建了一些跟蹤在timeouts這個全局變量中可用的超時函數。試試它的jsfiddle:http://jsfiddle.net/KqZmb/

(function() { 
    window.timeouts = []; 
    var _setTimeout = window.setTimeout; 
    window.setTimeout = function() { 
    var id = _setTimeout.apply(this, arguments); 
    timeouts.push(id); 
    _setTimeout(function() { 
     timeouts.splice(timeouts.indexOf(id), 1); 
     }, arguments[1]); 
    return id; 
    }; 
    var _clearTimeout = window.clearTimeout; 
    window.clearTimeout = function(id) { 
    _clearTimeout(id); 
    timeouts.splice(timeouts.indexOf(id), 1); 
    }; 
})(); 

您可以輕鬆適應它setIntervalclearInterval

我想,雖然說的是,你可能需要保持跟蹤你的超時,以避免在您的應用程序怪異的行爲...