Nodejs async each inside each inside 瀑布

Nodejs async each inside each inside waterfall

我已经为此苦思冥想太久了。也许这里有人可以帮我一下?

我有一个包含对象数组的对象,在继续之前我需要依次对每个对象进行一些操作。这是一个简化的示例,是我一直在尝试的众多示例之一:

    var demo = {
        one: ['1'],
        two: ['2'],
        three: ['3', '4', '5']
    };

    async.waterfall([
        function(callback) {
            console.log("Step 1");
            setTimeout(function() {
                    console.log("Doing stuff...");
                    callback(null, demo);
            }, 1000);
        },
        function(prevData, callback) {
            console.log("Step 2");
            async.each(prevData, function(obj) {
                async.each(obj, function(item, callback2) {
                    setTimeout(function() {
                            console.log("Doing stuff for item: "+item);
                            callback2(null, demo);
                    }, 1000);
                });
            });
            callback(null, demo);
        }
    ], function(err) {
        if(err) {
            alertify.error("Unhandled exception: "+err);
        } else {
            console.log("All stuff done.");
        }
    });

我期待的是:

Step 1
Doing stuff...
Step 2
Doing stuff for item: 1
Doing stuff for item: 2
Doing stuff for item: 3
Doing stuff for item: 4
Doing stuff for item: 5
All stuff done.

但我得到的是:

Step 1
Doing stuff...
Step 2
All stuff done.
Doing stuff for item: 1
Doing stuff for item: 2
Doing stuff for item: 3
Doing stuff for item: 4
Doing stuff for item: 5

如果一直在尝试,可能是我能想到的每个级别的回调的所有组合,除了正确的那个。一定很明显,但我就是不明白...

序列本身是正确的,但是应该操作项目的函数并没有执行 before later。

问题出在这部分:

    function(prevData, callback) {
        console.log("Step 2");
        async.each(prevData, function(obj) {
            async.each(obj, function(item, callback2) {
                setTimeout(function() {
                        console.log("Doing stuff for item: "+item);
                        callback2(null, demo);
                }, 1000);
            });
        });
        callback(null, demo);
    }

async.each 之后,您立即调用 callback(null, demo);。这是在 async.each 完成之前。您只需要在 async.each 完成后调用 callback。您可以通过向 async.each 添加另一个回调作为第三个参数来执行此操作,如下所示:

function (prevData, callback) {
    console.log("Step 2");
    async.each(prevData, function (obj) {
        async.each(obj, function (item, callback2) {
            setTimeout(function () {
                console.log("Doing stuff for item: " + item);
                callback2(null, demo);
            }, 1000);
        });
    }, function asyncEachDone(err) {
        callback(err, prevData)
    })
}