复杂的串行和并行承诺解析

Complex serial and parallel promises resolution

所以我有这个函数可以做 4 件事,必须按以下方式排序:

- promise1
- promiseAfter1
// In parallel
- promise2
- promiseAfter2

为了得到连续的承诺,我会写:

async sequence1() {
  const result = await promise1();
  const finalResult = await promiseAfter1(result);
}
async sequence2() {
  const result = await promise2();
  const finalResult = await promiseAfter2(result);
}

然后:

async finalSequence() {
  await Promise.all([sequence1, sequence2]);
}

但为了实现这一点,我不得不创建两个子函数(sequence1sequence2),出于代码可读性等原因,我想避免这两个子函数。

有没有一种方法可以实现相同的结果而不必创建两个子函数?

不应该有类似 Promise.sequence 的东西来顺序解决承诺吗?

这会写成:

Promise.all([
  Promise.sequence([promise1, promiseAfter1]),
  Promise.sequence([promise2, promiseAfter2]),
])

干杯

But in order to achieve this, I had to create two sub-functions (sequence1 and sequence2) which I'd like to avoid for code readability among other reasons.

我会说这些函数的可读性更多,而不是更少,只要您给它们起有意义的名字。不过见仁见智。

Shouldn't there be something like Promise.sequence that would sequentially resolve promises?

不是,不是;它不适合其他 promise 组合器(Promise.all,等等)。关于 promise 组合器的事情是它们与 promises 一起工作,但是你的 Promise.sequence 需要与 functions 一起工作。请记住,Promise.all 等不会让尚未发生的事情发生,他们只是观察并结合事情完成的结果。这就是承诺的用途:观察异步过程的结果。

有些东西 built-in 可以按顺序做事,但是,有些东西需要函数:then

async finalSequence() {
    await Promise.all([
        promise1().then(promiseAfter1),
        promise2().then(promiseAfter2),
    ]);
}

或者如果您不想将结果从一个传递到下一个,您可以使用内联函数:

// Either
async finalSequence() {
    await Promise.all([
        promise1().then(() => promiseAfter1()),
        promise2().then(() => promiseAfter2()),
    ]);
}
// Or
async finalSequence() {
    await Promise.all([
        (async () => { await promise1(); await promiseAfter1(); })(),
        (async () => { await promise2(); await promiseAfter2(); })(),
    ]);
}

(这些与 Promise.all 的数组中的内容略有不同,但您没有使用该数组,所以...)

但是如果你想写 sequence(比如说,假设函数应该不带参数地调用)放入你的标准实用程序库(我们都有一个,对吧?:-)),这很简单要做:

async function sequence(functions) {
    for (const fn of functions) {
        await fn();
    }
}

那么正如你所说,finalSequence 将是:

async finalSequence() {
    await Promise.all([
        sequence(promise1, promiseAfter1),
        sequence(promise2, promiseAfter2),
    ]);
}