有什麼方法可以查看當前正在運行的超時和/或使用setTimeout或setInterval創建的時間間隔嗎?尋找剩餘setTimeouts和setInterval
由於每一個返回一個ID,有沒有辦法在開發人員控制檯中查看當前的ID?這會幫助我在應用程序中發現「泄漏」。
我能想到現在要做到這一點的唯一方法是創建我的setInterval/setTimeout的調用的包裝。或者覆蓋窗口中的內置窗口(即window.setTimeout=function()
),然後讓對象圖保持跟蹤。
有什麼方法可以查看當前正在運行的超時和/或使用setTimeout或setInterval創建的時間間隔嗎?尋找剩餘setTimeouts和setInterval
由於每一個返回一個ID,有沒有辦法在開發人員控制檯中查看當前的ID?這會幫助我在應用程序中發現「泄漏」。
我能想到現在要做到這一點的唯一方法是創建我的setInterval/setTimeout的調用的包裝。或者覆蓋窗口中的內置窗口(即window.setTimeout=function()
),然後讓對象圖保持跟蹤。
基於this answer,
for (var i = 1; i < 99999; i++){
window.clearInterval(i);
window.clearTimeout(i);
}
希望這有助於!
@ K2xL:是的,基於這裏給出的鏈接,可能會嘗試重寫setTimeout/setInterval,然後如果運行時間過長,則使用行#'(new Error).lineNumber'觸發錯誤 – 2013-02-19 23:04:16
我剛剛爲您寫的代碼覆蓋了setTimeout
和clearTimeout
函數,並創建了一些跟蹤在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);
};
})();
您可以輕鬆適應它setInterval
和clearInterval
。
我想,雖然說的是,你可能需要保持跟蹤你的超時,以避免在您的應用程序怪異的行爲...
我認爲一個更好的方法來找到造成的setTimeout「泄漏」/Interval將在JS堆快照的單獨部分中顯示它們,而不是在開發人員控制檯中提供它們的列表。 – 2013-02-22 06:43:49