簡體   English   中英

Javascript:無法停止setTimeout

[英]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社區!

您的代碼有兩個主要問題:

  1. 每次超時都會覆蓋t ,每次迭代都會丟失對先前超時的引用。
  2. 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 因此,您最終只能清除最后一組。

你有一些問題:

  1. 其中主要的一個是,你覆蓋t您的每一次迭代for循環; 你需要一個t的數組來讓你的結構工作。
  2. 您正在使用for..in循環for..in數組的索引。 這不是什么for..in是(雖然有很多人混淆有關; 看到這篇文章 )。 for..in循環for..in 對象屬性名稱 ,而不是數組索引 ,因此這種用法在非平凡的情況下會中斷。 只需使用老式的for循環。
  3. 你要兩次聲明proxys 這實際上是無害的,但......
  4. 你根本沒有聲明proxy (這不是無害的;它變成了一個隱含的全局)。

我已經更新了Jordan的優秀答案中的代碼來解決這些問題。

看起來您正在設置多個超時(每個代理一個),但嘗試將它們保存在同一個變量中。 您可能需要在那里使用數組,而不是簡單的變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM