1. Promise.all
封装要点:
- 只有遍历的promise都成功返回,则返回,有一个就reject:
可以根据resolve的次数判断,resArray[index]可以完成返回值的一一对应 - 不用返回数组的长度和promise数组的长度做比较的原因是有可能靠后的实例先返回,从而造成之前下标的数组值为空值的情况。
static all(promiseArray) {
let resArray = [];
let idx = 0;
return new myPromise((resolve,reject) => {
promiseArray.map((promise,index) => {
if(isPromise(x)) {
promise.then(res => {
format(res,index,resolve)
},reject)
} else {
format(res,index,resolve)
}
})
})
function format(res,index,resolve) {
resArray[index] = res;
if(++idx === promiseArray.length) {
resolve(resArray)
}
}
}
// 判断是否是Promise
isPromise(x) {
if((typeof x === 'object' && typeof x !== 'null') || typeof x === 'function') {
let then = x.then
if(typeof then === 'function') {
return true
} else {
return false
}
} else {
return false
}
}
2. Promise.finaly
特性:
- 只有当finaly内部返回错误的promise,则之后链式调用才可能会返回finaly的值
- 如果里面有setTimeout等,finaly之后的链式调用会延迟执行,但是返回的值除第一条的情况下,均返回finaly之前的调用结果
封装思路
- 和promise的状态无关,所以then之后的两个函数都要写
- 当callback返回rejected状态时,promise.resolve实例状态会变成rejected
static finaly(callback) {
return this.then((res) => {
return Promise.resolve(callback()).then(() => res)
},(err) => {
return Promise.resolve(callback()).then((err2) => {
throw err},(err3) => {
console.log(err3,'err3')
})
})
}
3. Promise.race
特性: 返回最先返回的结果
static race(promiseArray) {
return new myPromise((resolve,reject) => {
promiseArray.map((promise) => {
if(isPromise(x)) {
promise.then(resolve,reject)
} else {
resolve(promise)
}
})
})
}