【问题标题】:promises sequence combination with Q承诺与 Q 的序列组合
【发布时间】:2018-08-05 03:40:47
【问题描述】:

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

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

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

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

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

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

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

所以我们有一个与第一个示例一样的 Promise 序列,但该序列的某些元素可以是一组 Promise,将其所有结果传递给序列的下一个元素(另一个 Promise 或一组 Promise)。

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

非常感谢!

【问题讨论】:

  • 这毫无意义。承诺不是可以执行的动作或可以传递某些东西的动作,它是结果。那么this.actions 数组到底是什么?
  • 嗯,它是一个返回承诺的函数数组。我的问题不清楚吗? p1 => api call => get a result .then((result) => { p2(result) } ... 以此类推,当序列的一个 promise 完成时,下一个 promise 将得到它的结果。如果不清楚让我知道我可以在哪里更清楚。
  • 没关系,但是你不应该写“其中this.actions是一系列承诺。”并将它们命名为p1p2等。
  • 好的,但你知道我的问题是什么吗?我的意思是可以理解吗?
  • 是的,我已经在写答案了……

标签: javascript promise q


【解决方案1】:

你在寻找

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 2015-02-25
    • 2015-05-12
    • 1970-01-01
    • 2015-02-04
    • 2014-08-07
    • 1970-01-01
    相关资源
    最近更新 更多