据我了解,async.series一次做一件事。你能帮我解释一下这个输出吗?
操作mongo数据库集合的代码:
async.series([
countDocuments(db,function(){console.log("Step 1 complete");}),
insertDocument(db,function(){console.log("Step 2 complete");}),
countDocuments(db,function(){console.log("Step 3 complete");}),
removeDocument(db,function(){console.log("Step 4 complete");}),
countDocuments(db,function(){
})], function(){
db.close();
});
输出:
Step 1 complete
Step 3 complete
Step 2 complete
Step 4 complete
这对我没有意义。当然,重点是等到2完成才开始3?
答案 0 :(得分:3)
您必须将回调函数传递给async.series
。目前,您只是直接调用所有这些功能 - 立即 - 并将结果传递给async.series
。此外,这些函数中的每一个都会从callback
传递一个async
参数,您需要异步调用该参数以告知步骤已完成且下一个步骤应该执行。
async.series([
function(cb) {
countDocuments(db,function(e){console.log("Step 1 complete");cb(e);});
},
function(cb) {
insertDocument(db,function(e){console.log("Step 2 complete");cb(e);}),
},
function(cb) {
countDocuments(db,function(e){console.log("Step 3 complete");cb(e);}),
},
function(cb) {
removeDocument(db,function(e){console.log("Step 4 complete");cb(e);}),
},
function(cb) {
countDocuments(db, cb); // the short version
}
], function(){
db.close();
});
答案 1 :(得分:1)
我认为你将async.series与async.waterfall混淆了。在这里,无论先前的功能是否已完成执行,您的4个功能都将启动。但是,一旦所有系列函数完成执行(它就像一个屏障),最终的回调(执行db.close())将被回调。如果使用async.waterfall,则每个函数都会将其结果传递给下一个函数。这意味着第一个将开始和结束,然后第二个将开始和结束,依此类推。
另一个问题是,你没有在每个函数结束时调用回调。如果你不调用回调,那么执行db.close()的函数永远不会被调用。