14

处理多个异步回调的最佳方式/库是什么?现在,我有这样的事情:

_.each(stuff, function(thing){
   async(thing, callback);
});

在为stuff.

最干净的方法是什么?我愿意使用图书馆。

4

6 回答 6

28

由于您已经在使用下划线,您可能会查看_.after. 它完全符合您的要求。从文档:

    _.after(count, function)

创建仅在第一次调用 count 次后才运行的函数版本。对于分组异步响应很有用,您希望在继续之前确保所有异步调用都已完成。

于 2012-04-24T02:57:52.573 回答
13

有一个很棒的库叫做Async.js,它可以通过许多异步和流控制助手来帮助解决此类问题。它提供了几个 forEach 函数,可以帮助您为数组/对象中的每个项目运行回调。

查看: https ://github.com/caolan/async#forEach

// will print 1,2,3,4,5,6,7,all done

var arr = [1,2,3,4,5,6,7];

function doSomething(item, done) {
  setTimeout(function() {
    console.log(item);
    done(); // call this when you're done with whatever you're doing
  }, 50);
}

async.forEach(arr, doSomething, function(err) {
    console.log("all done");
});
于 2012-04-24T02:57:01.967 回答
2

我为此推荐https://github.com/caolan/async 。您可以使用它async.parallel来执行此操作。

function stuffDoer(thing) {
    return function (callback) {
        //Do stuff here with thing
        callback(null, thing);
    }
}

var work = _.map(stuff, stuffDoer)
async.parallel(work, function (error, results) {
    //error will be defined if anything passed an error to the callback
    //results will be an unordered array of whatever return value if any
    //the worker functions passed to the callback
}
于 2012-04-24T03:00:26.300 回答
1

async.parallel() / async.series 应该适合您的要求。您可以提供在所有 REST 调用成功时执行的最终回调。

async.parallel([
    function(){ ... },
    function(){ ... }
], callback);
async.series([
    function(){ ... },
    function(){ ... }
], callback);
于 2016-07-28T18:09:05.780 回答
0

有一个柜台,说async_count。每次启动请求时(在循环内部)将其加一,并让回调将其减一并检查是否已达到零 - 如果是,则所有回调都已返回。

编辑:虽然,如果我是写这篇文章的人,我会链接请求而不是并行运行它们 - 换句话说,我有一个请求队列并让回调检查队列以获取下一个请求。

于 2012-04-24T02:56:46.790 回答
0

请参阅我对类似问题的回复:

在 node.js 中协调并行执行

我的fork()功能在内部自动维护计数器。

于 2012-04-24T03:00:10.530 回答