当前位置: 首页 > 面试题库 >

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

雍志文
2023-03-14
问题内容

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

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);

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



 类似资料:
  • 问题内容: 我正在尝试使用编写一个简单的代码,但是只是不愿等待它假定的时间而代码立即执行。我究竟做错了什么? 问题答案: 您正在立即调用该函数并计划其返回值。 使用: 注意:没有原谅。

  • 我想在一个HTML页面上做一个值,每5秒更新一次,这样就不会让服务器不堪重负。结果表明,我的函数中的setTimeout()没有适当延迟,而是立即被调用。有人能帮我找个线索吗?我真的不想给我的服务器太多的工作,因为我必须实现更多的Ajax。 代码如下:

  • 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行。 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法也不一定完全对,主要是看个人如何理解,因为有的人说立即调用,有的人说自动执行,所以你完全可以按照你自己的理解来取一个名字,不过我听很多人都叫它为“自执行”,但作者后面说了很多,来说服大家称呼为“立即调用的函数表达式”。

  • 问题内容: 有一个JSLint选项(实际上是The Good Parts之一),它“需要避免立即调用”,这意味着构造 而是需要写成 我的问题是-谁能解释为什么第二种形式可能会更好?它更具弹性吗?容易出错?与第一种形式相比,它有什么优势? 自问了这个问题之后,我开始理解在功能值和功能值之间进行清晰的视觉区分的重要性。考虑一下立即调用的结果在赋值表达式的右侧的情况: 尽管从语法上讲,最外面的括号不是必

  • 为什么这在Node.js控制台(在4.1.1和5.3.0中测试)中工作,但在浏览器中不工作(在Chrome中测试)? 这个代码块应该创建并调用一个匿名函数,该函数记录。 另外,当上述操作在节点中工作时。js,这不起作用: 也不是这个: 奇怪的是,当添加参数时,它实际上会在立即调用的部分抛出一个。

  • 问题内容: 例如,我可能想进行如下分配(在JavaScript中): 在Java中,如何使用Lambdas做类似的事情?编译器不喜欢这样的东西: 问题答案: 否,因为Lambda需要目标类型。您所能做的最好是将表达式转换为: 您必须为特定的lambda使用正确的功能接口。如您所见,它非常笨拙,没有用。 更新 上面的代码是JavaScript代码的直接翻译。但是,直接转换代码并不能总是获得最佳结果。