【问题标题】:Node.js async: How to combine multiple iterators with map?Node.js async:如何将多个迭代器与 map 结合起来?
【发布时间】:2016-04-24 09:08:18
【问题描述】:

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

【问题讨论】:

  • 尝试 async.parallel / async.series

标签: javascript node.js asynchronous node-async


【解决方案1】:

好吧,在玩了一会儿并阅读了文档之后,我的代码现在看起来是这样的:

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

【讨论】:

  • 抱歉,这段代码真的有效吗?看起来它正在将整个 infos 数组发送到 push 函数,而不是为每个 info 调用 push
  • 哦,我明白了。 pushInfos 函数实际上接收的是数组而不是每个信息,对吧?好吧,在这种情况下,您自己的答案是正确的,我实际上将每个信息发送到pushInfos
【解决方案2】:

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

如果您正在编写异步代码,我建议您查看 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 的答案与问题代码的行为相同。

【讨论】:

    猜你喜欢
    • 2020-11-07
    • 1970-01-01
    • 2020-06-13
    • 2018-10-13
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多