在Node.js中限制请求

sae*_*eed 7 javascript throttling settimeout node.js

我有一个阵列.我可以用foreach方法循环它.

data.forEach(function (result, i) {

     url = data[i].url;

     request(url);

});
Run Code Online (Sandbox Code Playgroud)

请求函数正在向给定的URL发出http请求.但是,同时提出所有这些请求会导致各种问题.

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

但我不知道如何将forach循环与setTimeOut/setInterval结合起来

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

谢谢你的帮助.

Ber*_*rgi 7

由于您的问题是全局性的,您应该调整您的request函数,一次只运行5个请求 - 使用全局静态计数器.如果你的要求是在类似之前

function request(url, callback) {
    ajax(url, callback);
}
Run Code Online (Sandbox Code Playgroud)

现在使用类似的东西

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);
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*.io 5

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
     );

 });
Run Code Online (Sandbox Code Playgroud)


I H*_*azy 3

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

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

makeRequest(data, 0);
Run Code Online (Sandbox Code Playgroud)

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

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

makeRequest(data, 0);
Run Code Online (Sandbox Code Playgroud)