[英]Javascript: Can't stop the setTimeout
我正在使用代理服務器檢查程序並使用以下代碼使用setTimeout函數以大約5秒的間隔啟動請求;
function check() {
var url = document.getElementById('url').value;
var proxys = document.getElementById('proxys').value.replace(/\n/g,',');
var proxys = proxys.split(",");
for (proxy in proxys) {
var proxytimeout = proxy*5000;
t = setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
}
}
但是一旦他們開始我就無法阻止他們!
function stopcheck() {
clearTimeout(t);
}
修復或更好的方法將更受歡迎。
謝謝Stack Overflow社區!
您的代碼有兩個主要問題:
t
,每次迭代都會丟失對先前超時的引用。 t
可能不是全局變量,因此stopcheck()
可能無法“看到” t
。 更新功能:
function check() {
var url = document.getElementById('url').value;
var proxys = document.getElementById('proxys').value.replace(/\n/g,',');
var timeouts = [];
var index;
var proxytimeout;
proxys = proxys.split(",");
for (index = 0; index < proxys.length; ++index) {
proxytimeout = index * 5000;
timeouts[timeouts.length] = setTimeout(
doRequest, proxytimeout, url, proxys[index];
);
}
return timeouts;
}
function stopcheck(timeouts) {
for (var i = 0; i < timeouts.length; i++) {
clearTimeout(timeouts[i]);
}
}
使用示例:
var timeouts = check();
// do some other stuff...
stopcheck(timeouts);
't'在哪里被定義? 它繼續在for循環中重新定義,因此你將松開每個超時句柄的跟蹤...
你可以保留一個句柄數組:
var aTimeoutHandles = new Array();
var iCount = 0;
for (proxy in proxys) {
var proxytimeout = proxy*5000;
aTimeoutHandles[iCount++] = setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
}
首先在兩個函數之外定義t
。 此外,你覆蓋t
每次迭代您for
循環。 也許構建一個引用集合,然后阻止它們在每個引用上循環和clearTimeout
。
每次設置間隔時都會覆蓋t
。 因此,您最終只能清除最后一組。
你有一些問題:
t
您的每一次迭代for
循環; 你需要一個t
的數組來讓你的結構工作。 for..in
循環for..in
數組的索引。 這不是什么for..in
是(雖然有很多人混淆有關; 看到這篇文章 )。 for..in
循環for..in
對象的屬性名稱 ,而不是數組的索引 ,因此這種用法在非平凡的情況下會中斷。 只需使用老式的for
循環。 proxys
。 這實際上是無害的,但...... proxy
(這不是無害的;它變成了一個隱含的全局)。 我已經更新了Jordan的優秀答案中的代碼來解決這些問題。
看起來您正在設置多個超時(每個代理一個),但嘗試將它們保存在同一個變量中。 您可能需要在那里使用數組,而不是簡單的變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.