复杂的串行和并行承诺解析
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]);
}
但为了实现这一点,我不得不创建两个子函数(sequence1
和 sequence2
),出于代码可读性等原因,我想避免这两个子函数。
有没有一种方法可以实现相同的结果而不必创建两个子函数?
不应该有类似 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),
]);
}
所以我有这个函数可以做 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]);
}
但为了实现这一点,我不得不创建两个子函数(sequence1
和 sequence2
),出于代码可读性等原因,我想避免这两个子函数。
有没有一种方法可以实现相同的结果而不必创建两个子函数?
不应该有类似 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
andsequence2
) 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),
]);
}