一尘不染

为什么我的应由setTimeout安排的函数调用立即执行?

javascript

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

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’设置了任意值,也没有效果。


阅读 284

收藏
2020-04-25

共1个答案

一尘不染

以这种形式将函数提供给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);

第二种格式有点怪异,但如果参数是标量值(字符串,整数等),则仍然可以使用。第三种格式有点不清楚,因此在这种情况下,第一种选择显然将最适合您。

2020-04-25