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

jas*_*son 0 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);


      }
  ) 
Run Code Online (Sandbox Code Playgroud)

Mah*_*h J 5

代码中有几个错误.

  1. callback(null, outputArray)在错误的地方打电话.它应该在最里面的if条件之后
  2. async.each最终回调只需要一个参数 - err因此results不可用

以下代码应该有效......

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);
});
Run Code Online (Sandbox Code Playgroud)

我假设catch代码也存在于DB promise查询中,否则最终的回调可能永远不会被调用.


Ber*_*rgi 5

当简单的 promise 更容易时,不要使用 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);
});
Run Code Online (Sandbox Code Playgroud)