完成catch和一些静态方法
// 添加catch方法
catch (onRejected) {
// 相当于then(null, reject)
return this.then(undefined, onRejected)
}
// 添加静态resolve方法
static resolve(value) {
// 如果参数是MyPromise实例,直接返回这个实例
if (value instanceof LuPromise) return value
return new LuPromise(resolve => resolve(value))
}
// 添加静态reject方法
static reject(value) {
return new Luromise((resolve, reject) => reject(value))
}
// 添加静态all方法
static all(list) {
return new LuPromise((resolve, reject) => {
// 创建数组
let arr = []
let count = 0
for (let [i, p] of list.entries()) {
// 数组参数如果不是LuPromise实例,先调用LuPromise.resolve
this.resolve(p).then(res => {
arr[i] = res
count++
// 所有状态都变成fulfilled时返回的LuPromise状态就变成ful
if (count === list.length) resolve(arr)
}, err => {
// 有一个被rejected时返回的MyPromise状态就变成rejected
reject(err)
})
}
})
}
// 添加静态race方法
static race(list) {
return new LuPromise((resolve, reject) => {
for (let p of list) {
// 只要有一个实例率先改变状态,新的LuPromise的状态就跟着改
this.resolve(p).then(res => {
resolve(res)
}, err => {
reject(err)
})
}
})
}
finally(CallBack) {
return this.then(
value => LuPromise.resolve(CallBack()).then(() => value),
reason => LuPromise.resolve(CallBack()).then(() => {
throw reason
})
)
:TODO
下篇,将克服一些困难,把这些方法各种边缘情况补齐,一个月内