代码之家  ›  专栏  ›  技术社区  ›  James Ko

节点。js-async:如何将多个迭代器与map结合起来?

  •  0
  • James Ko  · 技术社区  · 10 年前

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

    我想知道是否有办法将 getInfo pushInfo 函数,所以我只需要一个嵌套回调。大致如下:

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

    这样的API存在吗?或者我必须处理额外的代码吗?我试着看看 documentation on GitHub 但我在异步编程方面没有太多经验,所以有点难以理解。

    2 回复  |  直到 10 年前
        1
  •  1
  •   James Ko    10 年前

    好吧,在玩了一段时间并阅读了文档之后,我的代码现在是这样的:

    function upload(release, callback) {
        async.waterfall([
            async.apply(async.map, release.files, getInfo),
            pushInfos,
            function(next) {
                // do some work...
            }
        ], callback);
    }
    
        2
  •  1
  •   gfpacheco    10 年前

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

    如果您正在编写异步代码,我建议您查看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...
        });
    }
    

    编辑

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