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

标签 javascript loops for-loop 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);
    }
}

我希望以大约 10 秒的间隔调用“doRequest()”函数,但即使使用 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);

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

关于javascript - 为什么我的函数调用应该由 setTimeout 调度立即执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2037203/

相关文章:

bash gnu 并行帮助

java - 函数调用阻止 GUI 在 Java 中更新

c++ - 新的 C++11 range-for (foreach) 语法 : which compilers support it?

objective-c - 在 objective-c 中从 NSDictionary 创建 NSObject

javascript - 带有 C# 后端的 Electron GUI

javascript - Webpack:未知属性 "query"?

javascript - 在元素上悬停显示描述

javascript - Angular : Update data every few seconds

C# 更好地初始化列表然后遍历它,或者只是在循环条件下初始化?

Java保存2d图 block : for loop getting slower with each iteration up to 5 seconds for 10000 iterations