承诺与 Q 的序列组合

promises sequence combination with Q

我想动态创建 一系列承诺,动态地将其结果传递给下一个承诺。

所以我这样做了(从文档中获取)

this.actions.reduce(Q.when, Q());

其中 this.actions 是 return 承诺的函数数组。 [f1,f2,f3]。这运行良好,我们有一个很好的动态创建的承诺序列。

我现在想做的有点复杂,找不到怎么做(但我相信这是可能的,我只是在这里遗漏了一些东西)。

我希望能够创建相同的东西,但同时执行多个承诺(我猜是 q.all) 这是解释: this.actions = [f1,[f2,f3],f4]

f1 被执行,它的结果被传递给 f2 和 f3。 f2 和 f3 同时执行,两个结果都在完成后传递给 f4 f4被执行,可以使用f2&f3结果

所以我们有一个像第一个例子一样的承诺序列,但是这个序列的一些元素可以是一组承诺,将它们的所有结果传递给序列的下一个元素(另一个承诺或一组承诺)。

我想这并不难,但我对如何构建它有点困惑。

非常感谢!

您正在寻找

f1().then(x => Q.all([f2(x), f3(x)])).then(f4)

或者,如果将链写成归约序列,

[f1, x => Q.all([f2(x), f3(x)]), f4].reduce(Q.when, Q())

要以编程方式构建同时运行 f2f3 的函数,您可以使用

function concurrently(fns) {
    return x => Q.all(fns.map(fn => fn(x)));
}

[f1, concurrently([f2, f3]), f4].reduce(Q.when, Q())