const PENDING = 'pending' // 等待
const FULLFILLED = 'fullfilled' // 成功
const REJECTED = 'rejected' // 失败
class MyPromise {
constructor(generator) {
try {
generator(this.resolve, this.reject)
} catch (e) {
this.reject(e)
}
}
status = PENDING // promise 状态
successData = undefined // 成功之后的值
failReason = undefined // 失败后的原因
successArr = [] // 成功的回调函数,默认为空数组,为了链式调用时存储多个成功的回调函数
failArr = [] // 失败的回调函数,默认为空数组,为了链式调用时存储多个失败的回调函数
// 成功函数resolve,这里必须是箭头函数,需要修改this的指向
resolve = (value) => {
if (this.status === PENDING) {
this.status = FULLFILLED // 状态值修改为成功
this.successData = value // 记住成后的数据
// 判断成功回调是否存在,如果存在就调用,但是下面这种只适用于只有一个成功回调的情况,所以需要修改
// if(this.sucessCallBack){
// this.sucessCallBack(this.value)
// }
// while循环:只要this.successCallBack的长度不是0就会执行此函数
while (this.successArr.length) {
// shift:删除原数组第一项,并将其值返回
// this.successCallBack.shift():获取this.successCallBack数组的第1个函数,获取后再删除原数组的第1个值
this.successArr.shift()
}
} else {
return // 如果状态不是等待,阻止程序向下执行
}
}
// 失败函数
reject = (reason) => {
if (this.status === PENDING) {
this.status = REJECTED // 状态值修改为失败
this.failReason = reason // 记住失败后的原因
while (this.successArr.length) {
this.successArr.shift()
}
} else {
return // 如果状态不是等待,阻止程序向下执行
}
}
then(successCallBack, failCallBack) {
successCallBack = successCallBack ? successCallBack : (value) => values
failCallBack = failCallBack ? failCallBack : (reason) =>{throw Error(reason)}
}
}
console