Javascript:无法停止setTimeout

时间:2010-01-13 22:00:18

标签: javascript for-loop settimeout

我正在使用代理服务器检查程序并使用以下代码以大约5秒的间隔使用setTimeout函数启动请求;

        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社区!

6 个答案:

答案 0 :(得分:6)

您的代码存在两个主要问题:

    每次超时都会覆盖
  1. t,每次迭代都会丢失对先前超时的引用。
  2. t可能不是全局变量,因此stopcheck()可能无法“看到”t
  3. 更新的功能:

    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);
    

答案 1 :(得分:3)

定义'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]);

}

答案 2 :(得分:2)

首先在两个函数之外定义t。此外,您在t循环的每次迭代时都会覆盖for。也许建立一组参考文献,然后阻止它们循环,每个参考文献clearTimeout

答案 3 :(得分:0)

每次设置间隔时都会覆盖t。因此,您最终只能清除最后一组。

答案 4 :(得分:0)

你有一些问题:

  1. 主要是你在t循环的每次迭代中覆盖for;你需要一组t来使你的结构发挥作用。
  2. 您正在使用for..in循环遍历数组的索引。这不是for..in的用途(尽管有一些人对此感到困惑; see this article)。 for..in遍历对象的属性名称,而不是数组的索引,因此这种用法在非平凡的情况下会中断。只需使用老式的for循环。
  3. 您宣布proxys两次。这实际上是无害的,但是......
  4. 你根本没有声明proxy(这不是无害的;它变成了隐含的全局)。
  5. 我已经更新了Jordan的优秀答案,以解决这些问题。

答案 5 :(得分:0)

看起来您正在设置多个超时(每个代理一个超时),但尝试将它们保存在同一个变量中。您可能需要在那里使用数组,而不是简单的变量。