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

Node.js async: How to combine multiple iterators with map?

我是 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 但我在异步编程方面没有太多经验,所以有点头疼。

好吧,经过一番尝试和阅读文档后,我的代码现在是这样的:

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

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

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

但是如果你想用回调和异步编写你的代码,你能做的最好的事情是这样的:

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...
    });
}

编辑

这个答案其实和问题代码的表现不一样,我误解了问题,写错了。 James 的回答与问题代码的行为相同。