async.each 里面的 async.waterfall 不起作用?

foo*_*ser 3 javascript asynchronous node.js node-async

我正在尝试在一系列项目上运行 async.each。

对于每个项目,我想运行一个 async.waterfall。请参阅下面的代码。

var ids = [1, 2];

async.each(ids, 

    function (id, callback) {

        console.log('running waterfall...');

        async.waterfall([

            function (next) {

                console.log('running waterfall function 1...');

                next();
            },

            function (next) {

                console.log('running waterfall function 2...');

                next();
            }],

            function (err) {

                if (err) {
                    console.error(err);
                }
                else {
                    console.log('waterfall completed successfully!');
                }

                callback();
            });
    }, 

    function (err) {

        if (err) {
            console.error(err);
        }
        else {
            console.log('each completed successfully!');
        }

    });

return;
Run Code Online (Sandbox Code Playgroud)

此代码的输出如下所示:

running waterfall...
running waterfall function 1...
running waterfall...
running waterfall function 1...
running waterfall function 2...
running waterfall function 2...
waterfall completed successfully!
waterfall completed successfully!
each completed successfully!
Run Code Online (Sandbox Code Playgroud)

但我的意图是,我的理解是输出应该是这样的:

running waterfall...
running waterfall function 1...
running waterfall function 2...
waterfall completed successfully!
running waterfall...
running waterfall function 1...
running waterfall function 2...
waterfall completed successfully!
each completed successfully!
Run Code Online (Sandbox Code Playgroud)

我一直在查看代码,但我不知道出了什么问题,有没有人知道我的代码或我对异步方法应该做什么的期望不正确?

谢谢!

jfr*_*d00 5

async.each()尝试并行运行循环的所有迭代,因此所有迭代可以同时进行,并且将以不确定的顺序完成。您可以在文档中.each()清楚地看到这一点:

将函数 iteratee 并行应用于 arr 中的每个项目。iteratee 使用列表中的一个项目调用,并在它完成时进行回调。如果迭代器将错误传递给其回调,则立即调用主回调(对于每个函数)并带有错误。

请注意,由于此函数将 iteratee 并行应用于每个项目,因此不能保证 iteratee 函数将按顺序完成。

因此,这解释了为什么您的两个.waterfall()迭代同时进行而不是串行运行。

如果你想一个接一个地运行它们,那么你应该使用它 async.eachSeries()