2014-10-09 126 views
0

我有一個json文件,並且遍歷其內容並對每個迭代使用HTTP post請求。 POST請求將信息插入數據庫中。我需要在循環中或以某種方式在POST之間引入延遲。我現在是這樣的:需要在JavaScript循環迭代中的POST之間延遲

var request = require('request'); 

for (i = 0; i < arr.length; i++) { 
    request.post(
     'http://localhost:3000/post', 
     { form: { from: arr[i][0], to: arr[i][1]} }, 
     function (error, response, body) { 
      if (!error && response.statusCode == 200) { 
       console.log(body) 
      } 
     } 
    ); 
} 

目前,POST請求被稱爲一前一後幾乎瞬間,這對一些數據庫插入邏輯的需要兩者之間的某個時間的問題。有沒有人有一個好主意,如何實施延遲?

謝謝

+1

我寧願重寫應用程序以支持完整的'arr'請求。 (插入操作)。引入一個延遲似乎hacky – epoch 2014-10-09 10:35:17

+1

而不是作出假設工作可能會延遲,我會利用回調或承諾,並使這些帖子順序 – Johan 2014-10-09 10:40:06

+0

看到我的答案約翰的建議。 – Michael 2014-10-09 11:15:43

回答

3

你有問題是你混合同步(循環)和異步(請求)操作。

在繼續下一次迭代之前,沒有機制讓外層循環等待內部異步操作完成。

相反,您可以實現遞歸,需要回調函數來激發外部「循環」的下一次迭代。

function do_post_req(arr_key) { 
    request.post(
     'http://localhost:3000/post', 
     { form: { from: arr[i][0], to: arr[i][1]} }, 
     function (error, response, body) { 
      if (!error && response.statusCode == 200) { 
       console.log(body); 
       if (arr[key+1]) do_post_req(key+1); //<-- recursion 
      } 
     } 
    ); 
} 
do_post_req(0); //<-- kick things off with first array key 
+0

+1,雖然你可能想在if語句之外移動你的遞歸調用以繼續去儘管出錯 – Johan 2014-10-09 10:48:16

+1

是的,我不確定OP是否想要打破循環出錯,所以我把它留給了他。 – Utkanos 2014-10-09 12:40:21

1

也許使用setTimeout?雖然這看起來很詭異。

var interval = 10; 
for (i = 0; i < arr.length; i++) { 
    setTimeout(function() { 
     request.post(
      'http://localhost:3000/post', 
      { form: { from: arr[i][0], to: arr[i][1]} }, 
      function (error, response, body) { 
       if (!error && response.statusCode == 200) { 
        console.log(body) 
       } 
      } 
     ); 
    }, i * interval); 
} 
1

使用定時器:

var interval = 1000; 
function doPosts() { 
    if (arr.length == 0) 
     return; 
    data = arr.pop(); 
    request.post(
     'http://localhost:3000/post', 
     { form: { from: data[0], to: data[1]} }, 
     function (error, response, body) { 
      if (!error && response.statusCode == 200) { 
       console.log(body) 
      } 
     } 
    ); 
    setTimeout(doPosts, interval); 
} 
doPosts(); 
1

請看看異步模塊節點https://github.com/caolan/async#eacharr-iterator-callback

添加手動休眠/等待是因爲那裏有永遠有機會回調需要更長的時間比你設置或失敗的手動時間是一個壞主意。

var request = require('request'); 
var async = require('async'); 

async.each(arr, 
    function(arri, cb) { 
    request.post(
     'http://localhost:3000/post', 
     { form: { from: arri[0], to: arri[1]} }, 
     function (error, response, body) { 
      if (!error && response.statusCode == 200) { 
       console.log(body); 
       // do you insert stuff here before the cb() call so its done before the next request is executed 
       // if the insert stuff is asynchronous as well call cb() inside the callback of your insert 
       cb(); 
      } else { 
       cb(error); // only do this if you want to stop at error 
      } 
     } 
    ); 
    }, 
    function(err) { 
    if (err) { console.log(err); } 
    else { console.log("all done"); } 
    }); 

如果你想運行請求並行查看並行方法的異步。