2014-09-26 69 views
0

我有一個關於nodejs中的異步包的問題。異步for each問題與多個xmlhttprequests

本質上,我有一個對象數組,其中每個元素包含我需要形成一個xmlhttprequest到遠程服務器的信息。所以我想我可以使用async.forEach按順序觸發請求,將結果存儲在一個變量中,然後在我的代碼中使用它們。

下面是示例代碼:

async.series([ 
 
    function(callback) 
 
    { //async.series element 1 
 
     async.forEach(req_info_arr, function(req_info_element, callback) { 
 
      var url = ... //form the url using the info from req_info_element 
 
      var req = new XMLHttpRequest(); 
 
      req.open("GET", url, true); 
 
      req.send(); //fires the request 
 
      req.onload = function() { 
 
       
 
       //do stuff 
 
       callback(); 
 
       
 
      }//end of onload 
 
      
 
      req.onerror = function() { 
 
       //do stuff 
 
       callback(err); 
 
      } 
 
    }/*end of async_forEach */, callback); 
 
    callback(); 
 
    }, 
 
    function(callback){ 
 
    //async.series element 2 
 
    //do stuff...want this to be done only after we have received a response for every request fired in async.series element 1 
 
    } 
 
    ], function(err) { 
 
    });

什麼情況是這樣的:async.forEach越過每個元素在req_info_arr,觸發每個元素的請求。

一旦完成。這到達了async.series中的第二個元素。但是我還沒有收到對xhr在async.series元素1中的響應,所以我的代碼失敗了。

有沒有解決這個問題的方法?我誤解了任何東西嗎?

任何幫助/指針表示讚賞。

回答

0

我想這是因爲回調();正下方async.forEach,這將觸發立即在該系列中的下一個步驟:

. 
. 
. 
}/*end of async_forEach */, callback); 
callback(); //<-- remove this guy 
+0

謝謝,這有幫助。 – 2014-09-29 18:21:26

0

那是因爲你所呼叫的第一async.series()的async.forEach()塊之後的回調。

您需要刪除該回調();在線21.

+0

謝謝拉爾夫,你們都同時回答,但StackOverflow按照最古老的排序顯示Furqan的回答。試圖儘可能公平。 – 2014-09-29 18:22:13