es6 Promise.all() 和 Promise.race() 區別

Promise.all() 方法接收單個可迭代對象(如數組)做爲參數,並返回一個promise。每一個Promise都用一個數值進行了決議,對Promise.all() 的調用建立了新的 Promise p4。這些值的存儲順序保持了待決議(resolve)的Promise順序,與完成的前後順序無關,所以能夠將結果匹配到每一個Promise。若是任意Promise被拒絕,則p4會當即拒絕,沒必要等其餘 Promise結束。數組

/* eslint-disable prefer-promise-reject-errors,eol-last */
let p1 = new Promise((resolve, reject) => resolve(42))
let p2 = new Promise((resolve, reject) => reject(43))
let p3 = new Promise((resolve, reject) => resolve(44))

let p4 = Promise.all([p1, p2, p3])
let p5 = Promise.all([p1, p3])
p1.then(v=>console.log('p1 then: ' + v)) // p1 then: 42
p4.then(v=>console.log('p4 then: ' + v)) // 不執行
p4.catch(v=>console.log('catch: ' + v)) // catch: 43 p2被拒絕,p4的拒絕處理函數當即調用,不會等p1和p3結束執行。但p1和p2仍然會執行。
p5.then(v=>{
  console.log(Array.isArray(v)) // true
  console.log(v) // [ 42, 44 ]
})

 Promise.race()promise

監視多個Promise。接受一個包含需監視的Promise的可迭代對象,並返回一個新的Promise,但一旦來源Promise中有一個被解決,所返回的Promise就會馬上被解決。函數

let r1 = Promise.resolve('r41')
let r11 = Promise.reject('r41')
let r2 = new Promise((resolve, reject) =>{
  resolve('r42')
})
let r3 = new Promise((resolve, reject) =>{
  reject('rejcet43')
})
let r4 = Promise.race([r1, r2, r3])
r4.then(v=>console.log('r4: ' + v)) // r4: r41

let r5 = Promise.race([r2, r3])
r5.then(value => console.log('then:' + value)) // then:r42
r5.catch(value => console.log('catch:' + value)) // 不執行

let r6 = Promise.race([r11, r2, r3])
r6.then(v=>console.log('r6 then: ' + v))
r6.catch(v=>console.log('r6 catch: ' + v)) // r6 catch: r41
相關文章
相關標籤/搜索