我正在使用Node.js并进行多次异步调用,这些调用需要在完成后处理数据。我正在筑巢它们,但这是非常低效的,因为直到前一个完成才开始。我想出了这个,只是想知道它是否有任何明显的错误:
var f = function(){},
actualCallback = function() { /* Do real stuff */ },
callbacks = [f, f, f, f, actualCallback];
aync(function() {
callbacks.shift()();
});
aync(function() {
callbacks.shift()();
});
aync(function() {
callbacks.shift()();
});
aync(function() {
callbacks.shift()();
});
aync(function() {
callbacks.shift()();
});
答案 0 :(得分:2)
使用parallel中的async library功能。
答案 1 :(得分:1)
你不能定义一个在数组中运行的函数吗?
function asyncSequence(callbacks) {
function doAsync() {
async(function() {
if (!callbacks.length) return;
callbacks[0]();
callbacks = callbacks.slice(1);
setTimeout(doAsync, 0);
});
}
doAsync();
}
然后用你的回调函数数组调用它。
现在,如果你想同时启动所有异步回调,那么我首先看不到问题;只要有必要就开始吧。但是,如果你需要在所有这些项目结束时进行某种“加入”,那么你必须跟踪一般状态:
function asyncSequenceConcurrent(callbacks, whenFinished) {
var incomplete = callbacks.length;
for (var i = 0; i < callbacks.length; ++i) {
async((function(i) {
return function() {
callbacks[i]();
incomplete--;
if (!incomplete) {
whenFinished();
}
};
})(i));
}
}