控制流程:运行两个异步数组映射

Control flow: Run two asynchronous array maps

本文关键字:两个 异步 数组 映射 运行 控制流      更新时间:2023-09-26

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

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

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

我需要什么样的控制流来实现这一点?我猜是在异步库中。

在伪代码中:

var example = [1, 2, 3]
async.series([
  function () { example.map(a) },
  function () { example.map(b) }
], function (error, mappedExample) {
})

是的,使用异步库。做这种事真是太棒了。

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

您当然可以使用async库来处理这类事情,但在这种情况下,您可以通过简单地将您的函数链接在一起来自己处理:

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绝对是有用的;然而,没有理由不能自己去做。(当然,您需要添加错误处理)