在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
更改为任何您想要更改延迟的号码。