Node.js async:如何将多个迭代器与map结合使用?

时间:2016-01-19 02:27:23

标签: javascript node.js asynchronous node-async

我是Node.js的新手。我正在尝试使用async进行一些异步工作,其中我有多个嵌套回调,如果可能的话,我想将一些函数合并为一个。这是代码:

function getInfo(info, callback) { /*...*/ }
function pushInfos(infos, callback) { /*...*/ }

function upload(release, callback) {
    async.map(release.files, getInfo, function(err, infos) {
        if (err)
            return callback(err);
        pushInfos(infos, function(error) {
            if (error)
                return callback(error);
            // do some more work...
        });
    });
}

我想知道是否有办法合并getInfopushInfo函数,这样我只需要一个嵌套回调。像这样:

function upload(release, callback) {
    async.xxxx(release.files, [ // What goes here?
        getInfo,
        pushInfos
    ],
    function(error) {
        // do some more work...
    }
}

这样的API是否存在或我是否必须处理额外的代码?我试着查看documentation on GitHub,但我在异步编程方面没有多少经验,所以这有点过头了。

2 个答案:

答案 0 :(得分:1)

好吧,经过一些游戏并阅读文档后,我的代码现在就是这样:

function upload(release, callback) {
    async.waterfall([
        async.apply(async.map, release.files, getInfo),
        pushInfos,
        function(next) {
            // do some work...
        }
    ], callback);
}

答案 1 :(得分:1)

欢迎,我的朋友,回调地狱

如果您正在编写异步代码,我建议您先看看Promise而不是回调。

但是如果你想用回调和异步编写你的代码,你可以做的最好是:

function getInfo(info, callback) { /*...*/ }
function pushInfos(infos, callback) { /*...*/ }

function upload(release, callback) {
    async.map(release.files, function(file, callback) {
        async.waterfall([
            async.apply(getInfo, file),
            pushInfos
        ], callback);
    }, function(err, infos) {
        if (err)
            return callback(err);
        // do some more work...
    });
}

修改

这个答案实际上与问题代码不同,我误解了这个问题并写错了。詹姆斯'答案的行为与问题代码相同。