在Node.js中调节请求

我有一个数组。 我可以使用foreach方法遍历它。

data.forEach(function (result, i) { url = data[i].url; request(url); }); 

请求函数正在对给定的url进行http请求。 但同时提出这些要求会带来种种问题。

所以我认为我应该通过引入某种计时器来减慢速度。

但我不知道如何能够结合使用setTimeOut / setInterval的循环

请注意在服务器(nodejs)而不是浏览器上执行此操作。

感谢您的帮助。

而不是setTimeout可以让他们顺序运行。 我假设你的request()函数有一个callback参数。

 function makeRequest(arr, i) { if (i < arr.length) { request(arr[i].url, function() { i++; makeRequest(arr, i); }); } } makeRequest(data, 0); 

如果您在请求之间需要多一点时间,请将setTimeout添加到callback中。

 function makeRequest(arr, i) { if (i < arr.length) { request(arr[i].url, function() { i++; setTimeout(makeRequest, 1000, arr, i); }); } } makeRequest(data, 0); 

由于您的问题是全局性的,因此您应该调整您的request函数,使其每次只能运行5个请求 – 使用全局静态计数器。 如果你的要求是之前的东西

 function request(url, callback) { ajax(url, callback); } 

现在使用类似的东西

 var count = 0; var waiting = []; function request(url, callback) { if (count < 5) { count++; ajax(url, function() { count--; if (waiting.length) request.apply(null, waiting.shift()); callback.apply(this, arguments); }); } else waiting.push(arguments); } 
 data.forEach(function (result, i) { url = data[i].url; setTimeout( function () { request(url); }, 1000 * (i + 1) // where they will each progressively wait 1 sec more each ); }); 

您可以使用setTimeout延迟呼叫。 下面的代码将确保每个请求在timerMultiPlier毫秒之后被调用。

 var timerMultiPlier = 1000; data.forEach(function (result, i) { setTimeout(function(){ url = data[i].url; request(url); }, timerMultiPlier*i ); }); 

您可以通过索引来抵消每个项目的执行延迟,如下所示:

 data.forEach(function (result, i) { setTimeout(function() { url = data[i].url; request(url); }, i * 100); }); 

这将使每个迭代在前一个迭代之后执行大约100毫秒。 您可以将100更改为任何您想要更改延迟的号码。