gpt4 book ai didi

javascript - Node.js 循环中的 setTimeout

转载 作者:IT老高 更新时间:2023-10-28 23:07:21 26 4
gpt4 key购买 nike

我对 setTimeout 的工作原理有点困惑。我试图在循环中有一个 setTimeout ,以便循环迭代相隔 1 秒。每次循环迭代都会发出一个 HTTP 请求,而另一端的服务器似乎无法在如此短的时间内处理那么多请求。

for (var i = 1; i<=2000 && ok; i++) {
var options = {
host:'www.host.com',
path:'/path/'+i
};

setTimeout(makeRequest(options, i), 1000);
};

为什么这不起作用,我该如何实现?

谢谢

最佳答案

setTimeout 非阻塞,它是异步的。你给它一个回调,当延迟结束时,你的回调就会被调用。

这里有一些实现:

使用递归

您可以使用 recursive callsetTimeout 回调中。

function waitAndDo(times) {
if(times < 1) {
return;
}

setTimeout(function() {

// Do something here
console.log('Doing a request');

waitAndDo(times-1);
}, 1000);
}

这里是如何使用你的函数:

waitAndDo(2000); // Do it 2000 times

关于堆栈溢出错误:setTimeout 清除调用堆栈(参见this question),因此您不必担心setTimeout< 的堆栈溢出 递归调用。

使用生成器(io.js、ES6)

如果您已经在使用 io.js (使用 ES6 的“下一个”Node.js)您可以通过优雅的解决方案解决您的问题而无需递归:

function* waitAndDo(times) {
for(var i=0; i<times; i++) {

// Sleep
yield function(callback) {
setTimeout(callback, 1000);
}

// Do something here
console.log('Doing a request');
}
}

这里是如何使用你的函数(使用 co ):

var co = require('co');

co(function* () {
yield waitAndDo(10);
});

顺便说一句:这实际上是在使用循环;)

Generator functions documentation .

关于javascript - Node.js 循环中的 setTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15682524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com