与多个xmlhttprequests的async forEach问题

时间:2014-09-26 06:34:21

标签: javascript node.js asynchronous callback xmlhttprequest

我对nodejs中的异步包有疑问。

基本上,我所拥有的是一个对象数组,其中每个元素都包含我需要向远程服务器形成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中的第二个元素。但是我还没有收到对在async.series元素1中解雇的xhr的响应,所以我的代码失败了。

这个问题有解决方案吗?我误解了什么吗?

感谢任何帮助/指示。

2 个答案:

答案 0 :(得分:0)

我想这是因为回调();在async.forEach的正下方,这会立即触发系列中的下一步:

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

答案 1 :(得分:0)

那是因为您在async.forEach()块之后立即调用了第一个async.series()回调。

您需要删除该回调();在第21行。