繁体   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