Promise 代表非同步操作的物件,一個 Promise 可區分成三種狀態:
- pending - 初始狀態,可以視為處理中
- fulfilled - 表示操作成功
- rejected - 表示操作失敗
Promise 的併發控制就是當我們傳入多個 Promise時,藉由達成不同的條件,返回不同狀態的 Promise。
Promise.all()
當輸入的所有 Promise 的狀態都為 fulfilled 時,回傳 Promise 也是 fulfilled、操作成功;可按照輸入 Promise 的順序取得其回傳值。若有任何一項 rejected,立即判定操作失敗。
Promise.all([requestA, requestB, requestC]).then(result => {
const [resultA, resultB, resultC] = result;
// 全部都成功
}).catch(err => {
// 可取得第一個失敗原因
console.log(err);
})
Promise.allSettled()
當輸入的所有 Promise 的執行完畢時,不論為 fulfilled、rejected,回傳 Promise 必為 fulfilled;可按照其輸入的順序,取得各別的狀態(status)、回傳值(value)或錯誤原因(reason)。
Promise.all([requestA, requestB, requestC]).then(result => {
const [resultA, resultB, resultC] = result;
// 操作成功時,可以取得回傳值
// result = {status: 'fulfilled', value: 'Great Job!'}
// 操作失敗時,可以取得原因
// result = {status: 'rejected', reason: 'Because ....'}
})
Promise.any()
當輸入的所有 Promise 有任一個操作成功時,回傳 Promise 狀態為 fulfilled,且可取得其回傳值。若沒有任何一項成功,則是 rejected,錯誤原因是AggregateError。
Promise.any([requestA, requestB, requestC]).then(result => {
// 取得最快成功的回傳值
console.log(result);
}).catch(err => {
// AggregateError: No Promise in Promise.any was resolved
console.log(err);
});
Promise.race()
當輸入的所有 Promise 有任一個操作完成時,根據其狀態決定回傳 Promise 狀態,若第一個操作結果為成功,則為回傳狀態為 fulfilled;反之是 rejected。
Promise.race([requestA, requestB, requestC]).then(result => {
// 第一個人成功,走這條路
console.log(result);
}).catch(err => {
// 第一個人失敗,走這條路
console.log(err);
});