【问题标题】:Control flow: Run two asynchronous array maps控制流:运行两个异步数组映射
【发布时间】:2013-05-04 06:13:56
【问题描述】:

我有两个异步函数——它们接受一个函数作为参数,它在完成时调用(回调)。

function a(item, cb) {
  someAsyncOperation(function () {
    cb(item)
  })
}

function b(item, cb) {
  someAsyncOperation(function () {
    cb(item)
  })
}

我有一个数组。我需要使用Array.prototype.map 在这个数组上运行这些函数两次。当两个映射都完成后,我想要一个回调,它使用两个参数调用:一个错误和映射数组。

我需要什么样的控制流来实现这一点?我猜是async library 里的东西。

在伪代码中:

var example = [1, 2, 3]

async.series([
  function () { example.map(a) },
  function () { example.map(b) }
], function (error, mappedExample) {

})

【问题讨论】:

    标签: javascript node.js asynchronous control-flow async.js


    【解决方案1】:

    是的,使用async 库。做这种事情真是太棒了。

    如果您需要做一个映射,然后将结果传递给下一个函数,那么您需要查看async.waterfall

    【讨论】:

    • 我的示例最终会将一个对象传递给包含两个映射的回调。但是,我需要将两者合并。我认为可能有更好的方法吗?也许如果 async 可以做一个映射,然后将结果传递给下一个函数进行映射?
    • 你可以使用 async.waterfall 。我更新了我的答案。
    【解决方案2】:

    您绝对可以将异步库用于此类事情,但在这种情况下,您可以通过简单地将函数链接在一起来自己处理:

    var items = ["a", "b", "c", "d" ],
        foo = function (array, cb) {
            "use strict";
            array = array.map(function (element) {
                return "foo-" + element;
            });
    
            cb(array);
        },
        baz = function (array) {
            "use strict";
            array = array.map(function (element) {
                return "baz-" + element;
            });
    
            console.log(array);
        };
    
    foo(items, baz);
    

    结果:

    [ 'baz-foo-a', 'baz-foo-b', 'baz-foo-c', 'baz-foo-d' ]
    

    如果你的函数特别复杂或者你经常做这种事情,那么 async 肯定会有所帮助;但是,没有理由不能自己做。 (您当然需要添加错误处理)

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 1970-01-01
      • 2021-08-23
      • 2013-07-12
      • 2023-03-18
      • 2014-07-21
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      相关资源
      最近更新 更多