2

我正在研究代理服务器检查器,并使用以下代码以大约 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 社区!

4

6 回答 6

6

您的代码有两个主要问题:

  1. t每次超时都会被覆盖,每次迭代都会丢失对前一个超时的引用。
  2. tis 可能不是全局变量,因此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);
于 2010-01-13T22:13:29.413 回答
3

“不”在哪里被定义?它在 for 循环中不断被重新定义,因此您将失去对每个超时句柄的跟踪......

您可以保留一系列句柄:

var aTimeoutHandles = new Array();
var iCount = 0;
for (proxy in proxys) {

    var proxytimeout = proxy*5000;

    aTimeoutHandles[iCount++] = setTimeout(doRequest, proxytimeout, url, proxys[proxy]);

}
于 2010-01-13T22:03:00.227 回答
2

首先在两个函数之外定义t。此外,您将t在每次迭代时覆盖您的for循环。也许建立一个参考集合,然后为了阻止它们,你循环遍历clearTimeout每个。

于 2010-01-13T22:02:37.957 回答
0

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

于 2010-01-13T22:03:52.137 回答
0

你有几个问题:

  1. 主要的一个是您在t循环的每次迭代中都被覆盖for;您需要一个 s 数组t才能使您的结构正常工作。
  2. for..in用于循环遍历数组的索引。这不是for..in目的(尽管有很多人对此感到困惑;请参阅这篇文章)。for..in循环遍历object 的属性名称,而不是array 的索引,因此这种用法在非平凡的情况下会中断。只需使用老式for循环。
  3. 你声明proxys了两次。这实际上是无害的,但是...
  4. 你根本没有声明proxy(这不是无害的;它变成了一个隐含的全局)。

我已经更新了 Jordan 的优秀答案中的代码来解决这些问题。

于 2010-01-13T22:04:20.917 回答
0

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

于 2010-01-13T22:05:06.547 回答