这里可能有一个简单的解决方案: http://howtonode.org/control-flow-part-ii滚动到并行操作。另一种方法是让 A、 B 和 C 共享同一个回调函数,让这个函数有一个全局的或者至少是函数外的递增器,如果这三个函数都调用了回调函数,那么让它运行 D,当然你也必须把 A、 B 和 C 的结果存储在某个地方。
function fork (async_calls, shared_callback) {
var counter = async_calls.length;
var all_results = [];
function makeCallback (index) {
return function () {
counter --;
var results = [];
// we use the arguments object here because some callbacks
// in Node pass in multiple arguments as result.
for (var i=0;i<arguments.length;i++) {
results.push(arguments[i]);
}
all_results[index] = results;
if (counter == 0) {
shared_callback(all_results);
}
}
}
for (var i=0;i<async_calls.length;i++) {
async_calls[i](makeCallback(i));
}
}
这很简单,这使得 fork()具有相当的通用性,可以用来同步多个非同质事件。
在 Node.js 中的使用示例:
// Read 3 files in parallel and process them together:
function A (c){ fs.readFile('file1',c) };
function B (c){ fs.readFile('file2',c) };
function C (c){ fs.readFile('file3',c) };
function D (result) {
file1data = result[0][1];
file2data = result[1][1];
file3data = result[2][1];
// process the files together here
}
fork([A,B,C],D);
var l = new Wire();
funcA(l.branch('post'));
funcB(l.branch('comments'));
funcC(l.branch('links'));
l.success(function(results) {
// result will be object with results:
// { post: ..., comments: ..., links: ...}
});