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就會立刻被解決。
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