7

私は配列を持っています。foreach メソッドでループできます。

data.forEach(function (result, i) {

     url = data[i].url;

     request(url);

});

リクエスト関数は、指定された URL に対して http リクエストを作成しています。ただし、これらすべての要求を同時に行うと、さまざまな問題が発生します。

そこで、ある種のタイマーを導入して速度を落とさなければならないと考えました。

しかし、forach ループを setTimeOut/setInterval と組み合わせる方法がわかりません

ブラウザではなくサーバー(nodejs)でこれを行っていることに注意してください。

助けてくれてありがとう。

4

6 に答える 6

8

問題はグローバルであるため、関数を調整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);
}
于 2012-09-24T19:54:00.700 に答える
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
     );

 });
于 2012-09-24T19:42:13.260 に答える
3

setTimeoutそれらを順番に実行する代わりに。関数にはcallbackパラメーターがあると思いrequest()ます。

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

makeRequest(data, 0);

リクエスト間にもう少し時間が必要な場合はsetTimeout、コールバックに を追加します。

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

makeRequest(data, 0);
于 2012-09-24T19:44:45.553 に答える
1

setTimeout を使用して呼び出しを遅らせることができます。timerMultiPlier次のコードは、各リクエストが前のリクエストから数ミリ秒後に呼び出されることを保証します。

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

});
于 2012-09-24T19:42:00.853 に答える
0

次のように、各項目の実行遅延をインデックスでオフセットできます。

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

これにより、各反復は前の反復から約 100 ミリ秒後に実行されます。100遅延を変更したい任意の数に変更できます。

于 2012-09-24T19:42:39.887 に答える