什么是处理多个异步回调的最佳方法/库?目前,我有类似这样的代码:
_.each(stuff, function(thing){
async(thing, callback);
});
我需要在每个stuff
元素的回调函数被触发后执行一些代码。最干净的方法是什么?我可以使用库。
什么是处理多个异步回调的最佳方法/库?目前,我有类似这样的代码:
_.each(stuff, function(thing){
async(thing, callback);
});
我需要在每个stuff
元素的回调函数被触发后执行一些代码。既然你已经在使用Underscore,你可以看一下_.after
。它正好可以满足你的需求。从文档中可以看到:
after_.after(count, function)
创建一个版本的函数,只有在第一次被调用count次后才会运行。这对于分组异步响应非常有用,其中您希望在继续之前确保所有异步调用都已完成。
有一个很棒的库叫做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");
});
async.forEachSerial
。这给了你灵活性。对于简单的用例,计数功能非常好,并且已经内置在underscore中。试试吧! - Jamund Fergusonasync.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
}
async.parallel() / async.series应该符合你的要求。你可以提供一个最终回调函数,在所有REST调用成功时执行。
async.parallel([
function(){ ... },
function(){ ... }
], callback);
async.series([
function(){ ... },
function(){ ... }
], callback);
async_count
。在每次开始请求时(在循环内部),将其增加一,并让回调函数将其减少一并检查是否达到了零 - 如果是,则所有回调函数都已返回。