我正试图找到一个好的模式来执行一堆并行任务。

让我定义一些任务来举例说明。任务 a, b, c, d, e, f, g 执行为 a(function(er, ra){//task a returned, ra is result}) , bg

也是如此

还有一些任务应该在某个任务完成后执行,我们称之为ab, bc, abc, bd, bcd, af, fg,意思是ab 返回了 ab(ra, rb) 应该立即执行,当 bc 返回,bc(rb, rc)应该立即执行,如果a, b, c全部返回,abc(ra, rb, rc) 应该被执行。

对于最简单的情况,如果只有ab,我可以这样做:

(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); 
}); 

如您所见,ab 并行执行,当两者都完成后,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(":("); 
}); 


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!