如何检测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();
});
});
答案 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;
答案 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();
});
});