一、promise
1、返回一个promise对象 成功 失败 进行中三种状态 一旦改变不可逆
二、promise方法
promise.all(params)
入参params由多个promise组成的一个数组[promise1,promise2,promise3]
请求顺序promise1,promise2,promise3按顺序发起,
都成功:promise.all会等所有promise都成功结束后重新映射将请求结果按照入参的顺序排列后返回一个数组[res1,res2,res3],即res1对应promise1的结果,res2对应promise2的结果,,尽管三个请求完成的顺序可能不同,比如promise1请求接口用时5秒,promise3用时2秒,
有一个失败:有一个失败则直接走promise.all 的catch,即只要失败一个就不会走then
特殊处理:由于Promise.all执行的一堆Promise中,若有一个执行失败,则全部执行失败,返回执行失败的那个数据,如果我们也想要其他的执行正确的结果可以做如下处理:
当promise数组中有接口reject时,catch住结果直接返回,这样失败的结果就相当于该promise执行完的结果,也可以当做成功处理,所以在promise.all中我们可以监听到所有结果的返回
方案一:在单个promise上做catch捕获,为每个promise关联一个错误的处理函数
let promise1 = new Promise((resolve, reject) => { reject("我是promise1失败") }).catch(err => { return err }) let promise2 = new Promise((resolve, reject) => { setTimeout(() => { resolve("我是promise2成功") }, 2) }).catch(err => { return err }) promise.all([promise1 ,promise2]) .then(res=>console.log(res)) // ['我是promise1失败', '我是promise2成功'] .catch(err=>cosole.log(err))
方案二 在入参中处理
Promise.all([promise1, promise2].map(p => p.catch(err => err))) .then(res => { console.log(111, res) }) .catch(err => { console.log(222, err) })