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 實例的返回值,
誰先完成,返回誰。