【问题标题】:async.waterfall inside async.each doesn't work?async.each 中的 async.waterfall 不起作用?
【发布时间】:2016-07-01 16:52:59
【问题描述】:

我正在尝试对一组项目运行 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;

此代码的输出如下所示:

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!

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

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!

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

谢谢!

【问题讨论】:

    标签: javascript node.js asynchronous node-async


    【解决方案1】:

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

    将函数 iteratee 并行应用于 arr 中的每个项目。这 使用列表中的项目调用 iteratee,并调用 when 它已经完成了。如果迭代者将错误传递给其回调,则 main 回调(对于每个函数)立即使用 错误。

    请注意,由于此函数将 iteratee 应用于 并行,不能保证迭代函数会 按顺序完成。

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

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

    【讨论】:

    • 谢谢@jfriend00。很好的答案
    猜你喜欢
    • 1970-01-01
    • 2018-07-05
    • 2015-06-05
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2015-10-09
    • 2014-04-20
    • 1970-01-01
    相关资源
    最近更新 更多