如何在Node.js中获取async.each的结果

时间:2017-07-25 08:53:37

标签: javascript node.js express

我正在尝试填充outputArray,然后将其作为JSON发送。当我在console.log()之后添加outputArray.push时,我可以看到outputArray正在填充。但是在底部函数中,它会打印一个空数组。我看到底部函数在数组填充之前有效。如何修改下面的代码,以便我可以收到完整的数组。提前谢谢。

      var outputArray = [];

      async.each(generalArr, function(item, callback)
      {
          var docs =  collection.find({ id: { "$in": item}}).toArray();


        docs.then(function(singleDoc)
        {
          if(singleDoc)
          {


              outputArray.push.apply(outputArray, singleDoc);
          }
        });
        callback(null, outputArray);

    }, function(err,results)
      {
      if (err) 
        return console.log('ERROR', err);

      console.log(results);
      res.json(results);


      }
  ) 

2 个答案:

答案 0 :(得分:5)

代码中有一些错误。

  1. 您在错误的地方致电callback(null, outputArray)。它应该在最里面的if条件
  2. 之后
  3. async.each最终回调只需要一个参数 - err,因此results不可用
  4. 以下代码应该有效......

    var outputArray = [];
    
    async.each(generalArr, function(item, callback) {
        var docs =  collection.find({ id: { "$in": item}}).toArray();
        docs.then(function(singleDoc) {
            if(singleDoc) {
                outputArray.push.apply(outputArray, singleDoc);
            }
            callback();
        });
    }, function(err) {
        if (err) return console.log('ERROR', err);
    
        console.log(outputArray);
        res.json(outputArray);
    });
    

    我假设{promise}承诺查询的catch代码也存在,否则最终的回调可能永远不会被调用。

答案 1 :(得分:3)

当普通承诺变得如此简单时,不要使用async.js:

Promise.all(generalArr.map(function(item) {
  return collection.find({id: {"$in": item}}).toArray();
})).then(function(outputArray) {
  var results = outputArray.filter(Boolean);
  console.log(results);
  res.json(results);
}, function(err) {
  console.log('ERROR', err);
});