Promise 做为ES6的新语法,是面试和开发过程中常用的,它处理异步操作!
有人就会问了,啥事异步操作,就是:
你打红蓝buff的时候顺便把旁边的蛤蟆怪给打了,一举两得,或者一举多得,提高了打野的效率,C位不carry,我自己carry!!!
Promise 有几个api:Promise.resolve、Promise.reject、Promise.all、Promise.race
下面我们来谈Promise.all ,哎!!!
直接上图,用法先介绍:
Promise.all([Promise.resolve(1),Promise.resolve(2),Promise.resolve(3)]).then(res=>console.log(res),err=>console.log(err));
// [1, 2, 3]
Promise.all 只在所有的 promise 都 resolve 时才会调用 .then 中的成功回调。
Promise.all([Promise.reject(1),Promise.resolve(2),Promise.resolve(3)]).then(res=>console.log(res),err=>console.log(err));
// [1]
显然,这边出现了问题,Promise.reject直接中断了后面的Promise.resolve的操作。
我们想当 Promise.all中的 promise 对象 reject 失败时也能够调用回调函数,这个时候应该怎么做呢?
还不是用.then,为啥呢?因为.then返回的依旧是一个promise对象,不管是resolve还是reject都会执行.then。
Promise.all([Promise.reject(1).then((res)=>({status:'ok',res}),(err)=>({status:'not ok',err})),
Promise.resolve(2).then((res)=>({status:'ok',res}),(err)=>({status:'not ok',err})),
Promise.resolve(3).then((res)=>({status:'ok',res}),(err)=>({status:'not ok',err}))
])
.then(res=>console.log(res),err=>console.log(err));
// [{status:'not ok ',err:1}, {status:'ok',res:2}, {status:'ok',res:3}]
所有的都打印出来了!!! 包括resolve,reject状态!!!
如果按照上面的写法,假如有5个以上的请求,那么你是不是要写死!而且也不太复合我们传参的个数的严格限制!
那行!我们改写一波!!!! 写一个函数出来就行了!!!
function handlePromise(promiseList) {
return promiseList.map(promise=>promise.then((res)=>({status:'ok',res}),(err)=>({status:'not ok',err}))
)
}
这样调用promise.all 时,可以这么写
1、第一种:
Promise.all(handlePromise([Promise.reject(1),Promise.resolve(2),Promise.resolve(3)]))
.then(res=>console.log(res),err=>console.log(err))
2、第二种:
Promise.all = arr=>{
let aResult = [ ];
return new Promise(function (resolve,reject){
let i =0;
next();
function next() {
arr[i].then(function(res){
aResult.push(res);
i++;
if(i==arr.length) {
resolve(aResult)
}else{
next();
}
})
}
})
}
3、第三种:
我们再提取的一波!!!promise新出的allSettled Api不太好,我们自己弄!!!!
Promise.allSelected= function (promiseList){
return Promise.all(handlePromise(promiseList))
}
Promise.allSelected([Promise.reject(1),Promise.resolve(2),Promise.resolve(3)]).then(res=>console.log(res),err=>console.log(err))
好了,再见!!!!