Promise.all 和 Promise.race

1. Promise.resolve()

const promise = Promise.resolve(value) // 返回一个状态为 resolved 的 新的 Promise 实例
// 相当于
const  promise = new Promise(resolve => resolve(value))

2. Promise.reject()

let promise = Promise.reject(error) // 返回一个状态为 rejected 新的 Promise 实例
// 相当于
const promise = new Promise((resolve, reject) => reject(value))

3. Promise.all()

const promise = Promise.all(iterable) 

可以接受一个数组作为参数,

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 实例,组成一个数组,作为参数传入,只有当三个实例都成功,或者其中一个失败了才会把参数传给后面的回调函数,并执行。

三个都成功了, 会把三个实例成功的返回值作为一个数组传出来,数组成员的顺序和传入的实力参数顺序一致。

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)})

// 我错了

如果参数中的 Promise 实例有自己的 catch 方法,那么在 rejected 的时候,会调用 catch 方法,返回一个新的 Promise 实例,执行之后也会变成 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()类似,接收一个数组作为参数,

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

上面三个参数中第一个会在 1 秒后完成,所以会返回第一个 Promise 实例的返回值,
谁先完成,返回谁。

你可能感兴趣的:(Promise.all 和 Promise.race)