nodejs mongodb async.Each done

时间:2017-06-13 06:34:16

标签: node.js mongodb

如何检测async.Each何时完成循环所有加载到参数中的对象/数组。如何调用ALL FINISH日志。

db.collection('tests').find(query).limit(10).toArray(function(err, db_results) { 
    console.log("count: "+db_results.length);

    async.each(db_results, function (db_resultsx, cb) {
        db_resultsx._id = db_resultsx._id.toString();
        db_resultsx.xdate_visited = moment(db_resultsx.date_visited).format("YYYY-MM-DD hh:mm:ss");
        documents.push(db_resultsx);

    }, function(documents) {
          console.log(documents);
          console.log(documents.length);
          console.log("ALL FINISH");
          process.exit();
    });

});

2 个答案:

答案 0 :(得分:2)

async.each函数没有完成的原因是在第二个函数中没有调用回调。我创建了一个没有mongo调用的简单示例,但是超时了。

如果你查看文档https://caolan.github.io/async/docs.html#each,第二个参数是一个回调(在你的代码中这是值cb),需要调用它来表示你正在运行的代码的结尾。



function delayedReturn(callback) {
  setTimeout(function(){
    console.log('timeout complete');
    callback(false, ['first value']);
  }, 1000);
}
var documents = [];
delayedReturn(function(err, db_results) { 

    async.each(db_results, function (dbResult, cb) {
        
        documents.push(dbResult);
        console.log('documents pushed', dbResult)
        cb();

    }, function(error) {
        if(error)
        {
          console.error(error);
        }
          
    });
});

<script src="https://rawgit.com/caolan/async/master/dist/async.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

由于应该运行的代码不是异步的,所以没有理由使用async.each()

相反,您可以使用.map()

db.collection("tests").find(query).limit(10).toArray(function(err, db_results) {
  console.log("count: " + db_results.length);

  let documents = db_results.map(function(db_resultsx) {
    db_resultsx._id = db_resultsx._id.toString();
    db_resultsx.xdate_visited = moment(db_resultsx.date_visited).format(
      "YYYY-MM-DD hh:mm:ss"
    );
    return db_resultsx;
  });

  console.log(documents);
  console.log(documents.length);

  curl(URL, { data : documents }, function(err) {
    console.log("ALL FINISH");
    process.exit();
  });
});