promise.all 和 promise.race 都是用於將多個Promise實例包裝成一個新的Promise實例。
區別在於promise.all內的promise實例執行成功后返回一個集合。 promise.race則是返回promise實例中第一個執行完的函數。
promise.all :
1、只有 firstPromise secondPromise 的狀態都變成fulfilled,Promise 的狀態才會變成fulfilled,此時 所有promise實例 的返回值組成一個數組,傳遞給Promise 的回調函數。
2、只要 firstPromise secondPromise 之中有一個被rejected,Promise 的狀態就變成rejected,此時 第一個被reject的實例的 返回值,會傳遞給Promise 的回調函數。
const firstPromise = new Promise((res, rej) => { setTimeout(res, 500, [{ a: 1 }]); }); const secondPromise = new Promise((res, rej) => { setTimeout(res, 100, [{ n: 2 }]); }); Promise.all([firstPromise, secondPromise]).then(res => { console.log(res) // [[{a:1}],[{n:2}]] });
promise.race :
只要 firstPromise secondPromise 中有一個實例率先改變狀態,Promise 的狀態就跟着改變。那個率先改變的 Promise 實例的返回值,就傳遞給Promise 的回調函數。
當promise實例超過5s未返回結果,Promise 的狀態就會變為rejected
,從而觸發catch
方法指定的回調函數。
const firstPromise = new Promise((res, rej) => { setTimeout(res, 500, [{ a: 1 }]); }); const secondPromise = new Promise((res, rej) => { setTimeout(res, 100, [{ n: 2 }]); }); Promise.race([firstPromise, secondPromise]).then(res => { console.log(res) // [{ n: 2 }]
});