我正在使用Nodejs来实现一个Web应用程序。我有一个对象列表,我想为每个对象调用第三方API。问题是api有速率限制所以根据我的计算,我必须每1.5秒调用一次api。我尝试使用setTimeout方法但它在for循环中不起作用。我也查看了Cron模块,但它对我没有帮助,因为我只想为每个对象调用一次api。谁能帮我这个。这是我在服务器端的代码:
for(var obj in list)
{
setTimeout(function() {
apicall();
}, 1500);
}
答案 0 :(得分:7)
for
循环或任何循环的问题是它们通常很快。事实上,在list
上循环需要几微秒。这意味着在几微秒的范围内,您可以安排在1.5秒后调用几个匿名函数。这意味着所有功能,即使延迟,也几乎全部被解雇。
您需要在for
循环过程中导致延迟增加的内容。
最基本的设置是使用数组的当前索引作为乘数。
for(var i in list) { // list is an array, i is current index
setTimeout(function() {
apicall()
}, 1500 * i) // With each iteration, the delay increases
}
在旁注中,在这个基本示例中,您甚至不需要闭包:
setTimeout(apicall, 1500 * i)
答案 1 :(得分:1)
你可以创建一个变量,在循环的每次传递中增加时间,这样你的超时就会在每个循环上从1500,3000,4500增加1500每次你的原因不起作用是因为那个循环正在创建因为它们是异步调用所以在几毫秒之内都会有很多超时,所以在1600毫秒之后,你会有很多间隔一次性完成。