我正试图找到一个好的模式来执行一堆并行任务。
让我定义一些任务来举例说明。任务 a, b, c, d, e, f, g
执行为 a(function(er, ra){//task a returned, ra is result})
, b
到 g
还有一些任务应该在某个任务完成后执行,我们称之为ab, bc, abc, bd, bcd, af, fg
,意思是a
和 b
返回了 ab(ra, rb)
应该立即执行,当 b
和 c
返回,bc(rb, rc)
应该立即执行,如果a
, b
, c
全部返回,abc(ra, rb, rc)
应该被执行。
对于最简单的情况,如果只有a
和b
,我可以这样做:
(function(cb){
var count = 2, _ra, _rb;
function update(){if(--count == 0) cb(null, _ra, _rb)}
a(function(er, ra){_ra = ra; update()});
b(function(er, ra){_rb = rb; update()});
})(function(er, ra, rb){
ab(ra, rb);
});
如您所见,a
和b
并行执行,当两者都完成后,ab(ra, rb)
执行。
但是我怎样才能为很多并行任务做更多的事情呢?
请您参考如下方法:
你真正想要的是一个延迟模式,虽然像 futures .
function defer(f) {
// create a promise.
var promise = Futures.promise();
f(function(err, data) {
if (err) {
// break it
promise.smash(err);
} else {
// fulfill it
promise.fulfill(data);
}
});
return promise;
}
var da = defer(a), db = defer(b), dc = defer(c), dd = defer(d), de = defer(e), df = defer(f), dg = defer(g);
// when a and b are fulfilled then call ab
// ab takes one parameter [ra, rb]
Futures.join(da, db).when(ab);
Futures.join(db, dc).when(bc);
// abc takes one parameter [ra, rb, rc]
Futures.join(da, db, dc).when(abc);
Futures.join(db, dd).when(bd);
Futures.join(db, dc, dd).when(bcd);
Futures.join(da, df).when(af);
// where's e ?
Futures.join(df,dg).when(fg);
Futures.join(da,db,dc,dd,de,df,dg).fail(function() {
console.log(":(");
});