为什么我的函数调用应该通过setTimeout立即执行?
这是我的问题。 我有这个功能来测试代理服务器。
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); } }
我希望“doRequest()”函数能以大约10秒的间隔被调用,但即使使用setTimeout()函数也会立即调用。
欢迎任何想法,谢谢。
PS:即使我为“proxytimout”放置了一个任意值,也没有任何影响。
当你以这种形式给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);
第二种格式有点怪异,但如果参数是标量值(字符串,整数等),则工作正常。 第三种格式有点不清楚,所以在这种情况下,第一种选择显然对你最有效。
这行是这个问题:
setTimeout(doRequest(url,proxys[proxy]), proxytimeout);
编写doRequest()
实际上是调用函数。 你想要的是传递函数本身:
setTimeout(doRequest, proxytime, url, proxys[proxy]);
你误解了setTimeout
函数。
setTimeout
函数接受一个函数并稍后执行。
通过编写setTimeout(doRequest(url,proxys[proxy]), proxytimeout)
,您可以立即doRequest
函数,并将结果(假设它返回另一个函数)传递给setTimeout
。
您需要将doRequest
的参数传递给setTimeout
,如下所示:
setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
这将通过setTimeout
doRequest
函数本身(而不是先调用它),并将它传递给doRequest
的参数,当它最终调用它。