我有一个数组,我可以用foreach方法循环访问它。
data.forEach(function (result, i) {
url = data[i].url;
request(url);
});
request函数向给定的url发出http请求,但是同时发出所有这些请求会导致各种各样的问题。
所以我想我应该通过引入某种计时器来放慢速度。
但是我不知道如何将forach循环与setTimeOut/setInterval结合起来
请注意,我是在服务器(nodejs)上而不是在浏览器上执行此操作的。
谢谢你的帮助。
8条答案
按热度按时间3duebb1j1#
由于您的问题是全局性的,您应该调整您的
request
函数,使其一次只运行5个请求-使用全局静态计数器。现在使用类似于
mzaanser2#
wooyq4lh3#
而不是
setTimeout
可以让它们按顺序运行。我假设request()
函数中有一个callback
参数。如果请求之间需要多一点时间,则将
setTimeout
添加到回调中。qnakjoqk4#
你可以延迟调用使用setTimeout.下面的代码将确保每个请求得到调用后
timerMultiPlier
毫秒从它的前一个请求.trnvg8h35#
上面的许多解决方案,虽然对一些请求是可行的,但在处理成千上万的请求时,却毫无疑问地阻塞和阻塞了页面。与其将所有的计时器一个一个地排队,不如将每个计时器一个接一个地排队。如果你的目标是有一个漂亮的代码,有很多糖和“好东西”,那么下面就是适合你的解决方案。
漂亮、蓬松的糖衣用法:
t5zmwmid6#
您可以通过索引来抵消每个项的执行延迟,如下所示:
这将使每次迭代比上一次迭代晚100毫秒执行,您可以将
100
更改为任何您想要更改延迟的数字。myzjeezk7#
对这些问题做了一些补充,只是为了知识基础。
已创建异步版本,但没有递归。
将此代码放入一个.js中并调用,如下所示:
hsgswve48#
使用async / await进行快速节流的一种非常简单的解决方案是创建一个承诺,例如:
然后在需要暂停时等待它(在
async
函数中):注意:你需要使用一个
for
循环来完成这个任务,forEach
不会等待。