javascript - nodejs并行回调设计模式

标签 javascript design-patterns concurrency node.js parallel-processing

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

让我定义一些任务来举例说明。任务 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(":(");
});

关于javascript - nodejs并行回调设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5989538/

相关文章:

javascript - 如何让 Discord Bot 跳过删除包含 *DD 的消息

javascript - 内联 require() 在 requirejs 中工作但不适用于优化的杏仁构建

c# - 为什么 params byte[] 参数不起作用?

drupal-7 - Drupal 7 : Pathauto hierarchical taxonomy terms pattern

asp.net - 您如何将演示模型与 Webforms 一起使用?

python - 同时 Celery 任务共享一个公共(public)对象(数据库连接)

javascript - Backbone - 在 ItemView 之外访问 View 的 $el.attr

javascript - JavaScript中如何判断页面是否跳转到了 anchor (#)?

c++ - 违背 promise ,难以弄清楚 (C++)

java - Java中的并发——等待执行完成