const myPromise = /** @class */(function () {
function myPromise(fn) {
this.state = "PENDING" // 枚举类型 PENDING|RESOLVED|REJECTED
this.value = null
this.resolvedCallbacks = []
this.rejectedCallbacks = []
const resolve = (value) => {
if (this.state === "PENDING") {
this.state = "RESOLVED"
this.value = value
// 执行回调
this.resolvedCallbacks.forEach(callback => callback())
}
}
const reject = (value) => {
if (this.state === "PENDING") {
this.state = "REJECTED"
this.value = value
this.rejectedCallbacks.forEach(callback => callback())
}
}
try {
fn(resolve, reject)
} catch(error) {
reject(error)
}
}
myPromise.prototype.then = function (onfulfilled, onrejected) {
onfulfilled = typeof onfulfilled === 'function' ? onfulfilled : v => v
onrejected = typeof onrejected === 'function' ? onrejected : v => v
return new myPromise((resolve, reject) => {
if (this.state === 'PENDING') {
// 收集回调
this.resolvedCallbacks.push(() => resolve(onfulfilled(this.value)))
this.rejectedCallbacks.push(() => reject(onrejected(this.value)))
}
if (this.state === 'RESOLVED') {
resolve(onfulfilled(this.value))
}
if (this.state === 'REJECTED') {
reject(onrejected(this.value))
}
})
}
myPromise.prototype.catch = function (onrejected) {
return this.then(null, onrejected)
}
return myPromise
})()
注:
- Promise有三个状态且不可逆(PENDING,RESOLVED,REJECTED)
- Promise的参数是个高阶函数,函数的参数是Promise内部定义的resolve和reject两个函数
- resolve函数执行后Promise的状态改变成RESOLVED,收集执行成功的值value,执行then函数收集的成功回调函数数组(onfulfilled数组)
- reject函数执行后Promise的状态改变成REJECTED),收集执行失败的值value,执行then函数收集的失败回调函数数组(onrejected数组)