这是我的问题。我有这个功能来测试代理服务器。
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'设置了一个任意值,它也没有效果。
答案 0 :(得分: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);
第二种格式有点hacky,但如果参数是标量值(字符串,整数等),则可以使用。第三种格式有点不清楚,所以在这种情况下,第一种选择显然最适合你。
答案 1 :(得分:1)
这一行是问题所在:
setTimeout(doRequest(url,proxys[proxy]), proxytimeout);
写doRequest()
实际上是在调用函数。你想要的是传递函数本身:
setTimeout(doRequest, proxytime, url, proxys[proxy]);
答案 2 :(得分:0)
你误解了setTimeout
功能。
setTimeout
函数接受一个函数并稍后执行
通过编写setTimeout(doRequest(url,proxys[proxy]), proxytimeout)
,您将_ {调用doRequest
函数(立即),并将结果(假设它返回另一个函数)传递给setTimeout
。
您需要将doRequest
的参数传递给setTimeout
,如下所示:
setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
这将通过setTimeout
doRequest
函数本身(不先调用它),并且还会在最终调用它时将参数传递给doRequest
。