0

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

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) {

})
4

2 回答 2

1

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

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

于 2013-05-09T17:21:44.043 回答
0

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

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 肯定会有所帮助;但是,没有理由不能自己做。(您当然需要添加错误处理)

于 2013-05-09T18:30:58.377 回答