跳至內容
Astera Technology

多個 Promise 成敗不同,結果仍按原次序整理

逐項看成敗記錄,結果位置仍跟輸入次序。

下載完整個案資料及參考答案 ↓

先追這段程式

三個本地 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)));
確實的 console 輸出
[{"status":"fulfilled","value":"Markup"},{"status":"rejected","reason":"Local failure"},{"status":"fulfilled","value":"Layout"}]
值與執行位置
輸入工作狀態記錄欄位
Markupfulfilledvalue: Markup
Local failurerejectedreason: Local failure
Layoutfulfilledvalue: 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"}]}

原始例子檔案