async.series不是连续做事。为什么?

时间:2015-05-18 16:37:04

标签: javascript async.js

据我了解,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?

2 个答案:

答案 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()的函数永远不会被调用。