2017-11-28 4 views
0

3〜5個のURLを含むリストがあるとします。リクエストは5秒ごとに1つずつ行う必要があります。私のようなコードを書いた:ノードで複数のHTTPリクエストに対してsetIntervalを適切に使用する方法

setInterval(() => { 
    array.foreach(element => { 
    request 
    .get(element.url) 
    .on('response', function(response) { 
     console.log(response); 
     } 
    }); 
}, 5000) 

しかし、エンキューのsetIntervalは、要求を実行するよりも高速であるため、.onコールバックが応答していません。私は、setIntervalをエンキューする前に、私が.onコールバックを終了したことを確認する必要があります。

どうすればいいですか?

+0

あなたがたsetIntervalの内側にあなたのforeachを入れているが。したがって、5秒(5000ms)ごとに、すべてのget要求を実行しようとします。つまり、毎回3〜5回のget要求が発生します。本当にそれが必要ですか?または、実行するリクエストが1回必要ですが、5秒後にリクエスト2を要求するなどしますか? –

+0

毎回すべてのget要求を実行する必要があります。最も簡単な解決策は、setIntervalを5秒より長くすることですが、要求を完了するための正確な時間を計算することはできません。 –

+0

成功コールバックを使用する必要があります。または、RXJSを使用している場合は、オブザーバブルを作成できます。あなたはこれらの概念を知っていますか? –

答えて

0

Async.jsモジュールをお勧めします。あなたは非同期ループを解決したい場合は

、次のことができます。

var i = 0; 
async.whilst(
    function() { return i < array.length; }, 
    function(next) { 
    var elemet = array[i++]; 

    request 
     .get(element.url) 
     .on('response', function(response) { 
     console.log(response); 

     // Do next while 5s passed 
     setTimeout(next, 5000); 
     } 
    } 
    }, 
    function (err, n) { 
    // All Task over 
    } 
); 

それとも、いくつかの同時実行しようとする場合は:

// create a queue object with concurrency 2 
var q = async.queue(function(task, next) { 
    console.log('request ' + task.url); 

    request 
    .get(task.url) 
    .on('response', function(response) { 
     console.log(response); 
     next(); 
    } 
    } 
}, 2); 

// assign a callback 
q.drain = function() { 
    console.log('all task have been processed'); 
}; 

// Push a request task to the queue every 5s 
setInterval(function() { 
    let task = array.shift() 
    if (task) { 
    q.push(task, function(err) { 
     console.log('finished processing', task.url); 
    }); 
    } 
}, 5000); 
0

お試しください。

var requestArray = [ 

{ 
    url: 'some URL number 1' 
}, 

{ 
    url: 'some URL number 2' 
}, 

{ 
    url: 'some URL number 2' 
} 

] 

function makeRequests(){ 

for(var i=0; i<requestArray.length; i++){ 
    request.get(requestArray[i].url) 
    .on('response',function(response){ 
     console.log(response); 
     if(i == requestArray.length - 1)//You can check any condition here if you want to stop executing get requests{ 
      makeRequests(); 
     } 
    }) 
    } 
} 
関連する問題