为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

大话西游666 2019-07-02 14:29:27
为什么我的函数调用应该由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’设置了任意的值,它也没有效果。
查看完整描述

3 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

当您以这种形式将函数交给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);

第二种格式有点麻烦,但如果参数是标量值(字符串、INT等),则仍然有效。第三种格式有点不清楚,因此在这种情况下,第一种选择显然最适合您。


查看完整回答
反对 回复 2019-07-02
?
慕神8447489

TA贡献1780条经验 获得超1个赞

这里的问题是:

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

写字doRequest()实际上是调用这个函数。您希望传递函数本身:

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


查看完整回答
反对 回复 2019-07-02
?
千万里不及你

TA贡献1784条经验 获得超9个赞

你误会了setTimeout功能。

这个setTimeout函数接受一个函数,并在以后执行它。
通过写作setTimeout(doRequest(url,proxys[proxy]), proxytimeout),你打电话给doRequest函数,并将结果(假设它返回另一个函数)传递给setTimeout.

你得通过doRequest参数setTimeout,就像这样:

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

这会过去的setTimeout这个doRequest函数本身(不首先调用它),并将参数传递给它。doRequest当它终于召唤它的时候。


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 631 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号