16

这是我的问题。我有这个功能来测试代理服务器。

function crawl() {
    var oldstatus = document.getElementById('status').innerHTML;
    document.getElementById('status').innerHTML = oldstatus + "Crawler Started...<br />";
    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*10000;
        setTimeout(doRequest(url,proxys[proxy]), proxytimeout);
    }
}

我希望以大约 10 秒的间隔调用“doRequest()”函数,但即使使用 setTimeout(),也会立即调用函数。

欢迎任何想法,谢谢。

PS:即使我为“proxytimout”设置了一个任意值,它也没有效果。

4

3 回答 3

14

当您以该形式将函数提供给 setTimeout 时,该函数将被执行而不是传递给 setTimeout。您有三种选择可以让它发挥作用:

首先给出函数,然后给出超时和参数作为最后一个参数:

setTimeout(doRequest, proxytimeout, url, proxys[proxy]);

或者只是写一个将被评估的字符串:

setTimeout('doRequest('+url+','+proxys[proxy]+')', proxytimeout);

第三种风格是传递一个调用该函数的匿名函数。请注意,在这种情况下,您必须在闭包中执行此操作以防止值在循环中更改,因此有点棘手:

(function(u, p, t) {
    setTimeout(function() { doRequest(u, p); }, t);
})(url, proxys[proxy], proxytimeout);

第二种格式有点老套,但如果参数是标量值(字符串、整数等),它仍然有效。第三种格式有点不清楚,所以在这种情况下,第一种选择显然最适合您。

于 2010-01-10T14:06:22.863 回答
1

这行是问题所在:

setTimeout(doRequest(url,proxys[proxy]), proxytimeout);

doRequest()其实就是调用函数。你想要的是传递函数本身:

setTimeout(doRequest, proxytime, url, proxys[proxy]);
于 2010-01-10T14:06:19.760 回答
0

你误解了这个setTimeout功能。

setTimeout函数接受一个函数并稍后执行它。
通过编写setTimeout(doRequest(url,proxys[proxy]), proxytimeout)_calldoRequest函数(立即),并将结果(假设它返回另一个函数)传递给setTimeout.

您需要将doRequest的参数传递给setTimeout,如下所示:

setTimeout(doRequest, proxytimeout, url, proxys[proxy]);

This will pass setTimeout the doRequest function itself (without calling it first), and will also pass it the parameters to give to doRequest when it finally calls it.

于 2010-01-10T14:07:49.973 回答