Promise其它方法一
Promise其它方法在一些场景里面使用还是蛮有用的,今天完善一下其它一些方法。
catch:
这个是最简单的,catch其实就是没有成功方法resolve的then函数,所以catch方法:
catch(errCallback){
return this.then(null, errCallback);
}
Promise.resolve()和Promise.reject():
这两个用法很简单,就是立马执行成功或者失败,所以直接返回一个Promise然后直接执行成功失败方法,这是一个静态方法:
static resolve(value){
return new Promise((resolve, reject) => {
resolve(value);
})
}
static reject(value){
return new Promise((resolve, reject) => {
reject(value);
})
}
然后这边引申出一个问题,如果我是这样调用:
Promise.resolve(new Promise((resolve, reject) => {
setTimeout(() => {
resolve(123);
}, 3000)
})).then(res => {
console.log(res);
})
Promise.reject(new Promise((resolve, reject) => {
setTimeout(() => {
resolve(321);
}, 3000)
})).catch(err => {
console.log(err);
})
Promise的resolve方法如果返回一个Promise,那么会等待这个Promise执行完,reject不会,所以我们在原来的resolve方法要加个判断,如果是Promise,就等待,所以添加一个判断方法:
function isPromise(x){
if((typeof x === 'object' && x !== null) || typeof x === 'function'){
if(typeof x.then === 'function'){
return true;
}
};
return false;
}
if(isPromise(value)){
value.then((res) => {
resolve(res);
}, (err) => {
reject(err);
})
return;
}
这个判断想写可以写跟resolvePromise一样,看是否是其它Promise。这个方法简写:
if(isPromise(value)){
return value.then(resolve, reject);
}
可以这样看代码:
let resolve = (value) => {
if(isPromise(value)){
value.then(res => resolve(res), err => reject(err))
return;
}
//...
};
``
应该就好理解多了,为什么可以那样简写。
all方法:
all方法也是一个静态方法,会返回所有成功之后结果,结果是按顺序的,只要有一个失败就是失败:
static all(promises) {
return new Promise((resolve, reject) => {
let resArr = [];
let index = 0;
let resCreat = (res, index) => {
resArr[index] = res;
index++;
if(index === promises.length){
resolve(resArr);
}
};
for(let i = 0; i < promises.length; i++){
let current = promises[i];
if(isPromise(current)){
current.then(y => {
resCreat(y, i);
}, r => {
reject(r);
})
}else{
resCreat(current, i);
}
}
})
}
循环传入的数组,如果是promise实例,就调用then方法,处理结果,如果不是就直接当作普通值处理结果,这边不能用push,因为不同的参数都是异步的,我们要保证顺序,就只能用index处理,如果都成功,我们要判断传入的数组长度跟当前的长度一样,就返回成功结果。
image
发表评论 (审核通过后显示评论):