Promise.all 和 Promise.race

1. Promise.resolve()

const promise = Promise.resolve(value) // 返回一個狀態(tài)為 resolved 的 新的 Promise 實例
// 相當于
const  promise = new Promise(resolve => resolve(value))

2. Promise.reject()

let promise = Promise.reject(error) // 返回一個狀態(tài)為 rejected 新的 Promise 實例
// 相當于
const promise = new Promise((resolve, reject) => reject(value))

3. Promise.all()

const promise = Promise.all(iterable) 

可以接受一個數(shù)組作為參數(shù),

Promise.all([
  new Promise((resolve,reject)=>{resolve(1)}),
  new Promise((resolve,reject)=>{resolve(2)}),
  new Promise((resolve,reject)=>{resolve(3)}), 
]).then(result=>{ console.log(result) }).catch(err=>{console.log(err)})

上面 是三個 Promise 實例,組成一個數(shù)組,作為參數(shù)傳入,只有當三個實例都成功,或者其中一個失敗了才會把參數(shù)傳給后面的回調函數(shù),并執(zhí)行。

三個都成功了, 會把三個實例成功的返回值作為一個數(shù)組傳出來,數(shù)組成員的順序和傳入的實力參數(shù)順序一致。

Promise.all([/*...*/]).then(result=>{ console.log(result) })
// [1, 2, 3]

如果其中有失敗的,那么在遇到第一個失敗的實例的時候就會把該實例的返回值傳出來。

const p1 = new Promise((resolve,reject)=>{reject('我錯了')}).catch(err => err)
const p2 = new Promise((resolve,reject)=>{reject(2)}).catch(err => err)
const p3 = new Promise((resolve,reject)=>{resolve(3)})
Promise.all([p1, p2, p3])
.then(result=>{ console.log(result) })
.catch(err=>{console.log(err)})

// 我錯了

如果參數(shù)中的 Promise 實例有自己的 catch 方法,那么在 rejected 的時候,會調用 catch 方法,返回一個新的 Promise 實例,執(zhí)行之后也會變成 resolved ,所以 Promise.all() 里面所有的實例都會是 resolved,因此還是會調用 then后面的方法。

const p1 = new Promise((resolve,reject)=>{reject('我錯了')}).catch(err => err)
const p2 =  new Promise((resolve,reject)=>{reject('我也錯了')}).catch(err => err),
const p3 = new Promise((resolve,reject)=>{resolve(3)})
Promise.all([p1, p2, p3])
.then(result=>{ console.log(result) })
.catch(err=>{console.log(err)})

// ["我錯了", "我也錯了", 3]

4. Promise.race()

const promise = Promise.race(iterable)

Promise.all()類似,接收一個數(shù)組作為參數(shù),

Promise.race([
  new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)),
  new Promise((resolve, reject) => setTimeout(() => reject(new Error("報錯了")), 2000)),
  new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).then(result=>console.log(result);
 // 1

上面三個參數(shù)中第一個會在 1 秒后完成,所以會返回第一個 Promise 實例的返回值,
誰先完成,返回誰。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容