先追這段程式
三個本地 Promise 分別是 Markup、Local failure 和 Layout。要逐項核對成敗,失敗項目不會因整理完成而變成功。
const jobs=[Promise.resolve('Markup'),Promise.reject('Local failure'),Promise.resolve('Layout')];
Promise.allSettled(jobs).then(results=>console.log(JSON.stringify(results)));
[{"status":"fulfilled","value":"Markup"},{"status":"rejected","reason":"Local failure"},{"status":"fulfilled","value":"Layout"}]| 輸入工作 | 狀態 | 記錄欄位 |
|---|---|---|
| Markup | fulfilled | value: Markup |
| Local failure | rejected | reason: Local failure |
| Layout | fulfilled | value: Layout |
結果為何如此
allSettled 等全部有結果後,按輸入位置傳回每項記錄。成功項有 value,失敗項有 reason;完成先後不改位置。若有一項一直未完成,整體便繼續等待,本例沒有這種輸入。
比較另一種寫法
同一組輸入交給 Promise.all,得到拒絕而非逐項結果陣列。下面另開例子,用 catch 處理失敗。
const jobs=[Promise.resolve('Markup'),Promise.reject('Local failure'),Promise.resolve('Layout')];
Promise.all(jobs).then(values=>console.log(JSON.stringify(values))).catch(reason=>console.log(JSON.stringify({reason})));
{"reason":"Local failure"}試清邊界
第二個延後完成的 Promise 先完成,結果會排第一嗎?
查看參考答案
不會,仍排第二。以下先完成 Second 再完成 First,結果仍是 First、Second。
let first,second;const jobs=[new Promise(resolve=>{first=resolve;}),new Promise(resolve=>{second=resolve;})];
const settlementOrder=[];const result=Promise.allSettled(jobs);second('Second');settlementOrder.push('Second');first('First');settlementOrder.push('First');
result.then(results=>console.log(JSON.stringify({settlementOrder,results})));
{"settlementOrder":["Second","First"],"results":[{"status":"fulfilled","value":"First"},{"status":"fulfilled","value":"Second"}]}