所以我有這個函式可以做 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]),
])
干杯
uj5u.com熱心網友回復:
但為了實作這一點,我必須創建兩個子函式 (
sequence1和sequence2),出于代碼可讀性以及其他原因,我想避免這些子函式。
如果你給它們起有意義的名字,我會說這些函式更易讀,而不是更少。但這是一個見仁見智的問題。
不應該有類似的東西
Promise.sequence會順序解決承諾嗎?
不是真的,不;它不適合其他承諾組合器(Promise.all等)。關于 promise 組合器的事情是它們與promises一起使用,但您Promise.sequence需要使用函式來代替。請記住Promise.all,等等,不要讓任何不會發生的事情發生,他們只是觀察并結合事情完成的結果。這就是 promise 的用途:觀察異步行程的結果。
但是,有一些內置的東西可以按順序做事,它需要一些功能: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),
]);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/430585.html
標籤:javascript 异步 承诺
