function MyPromise(executor) {
this.onResolveCallbacks = []
this.onRejectCallbacks = []
this.status = "pending"
this.result = undefined
let self = this
function resolve(v) {
if (self.status === "pending") {
self.status = "fulfilled"
self.result = v
setTimeout(() => { // 异步执行回调函数
if (self.onResolveCallbacks[0]) {
let thenValue = self.onResolveCallbacks[0](v)
if (thenValue instanceof MyPromise) {
thenValue.then((resolveValue) => self.onResolveCallbacks[self.onResolveCallbacks.length - 1](resolveValue), (resolveValue) => self.onRejectCallbacks[self.onRejectCallbacks.length - 1](resolveValue))
} else {
self.onResolveCallbacks[self.onResolveCallbacks.length - 1](thenValue)
}
}
}, 0)
}
}
function reject(v) {
if (self.status === "pending") {
self.status = "rejected"
self.result = v
setTimeout(() => { // 异步执行回调函数
if (self.onRejectCallbacks[0]) {
let thenValue = self.onRejectCallbacks[0](v)
if (thenValue instanceof MyPromise) {
thenValue.then((resolveValue) => self.onResolveCallbacks[self.onResolveCallbacks.length - 1](resolveValue), (rejectValue) => self.onRejectCallbacks[self.onRejectCallbacks.length - 1](rejectValue))
} else {
self.onResolveCallbacks[self.onResolveCallbacks.length - 1](thenValue)
}
}
}, 0)
}
}
try {
executor(resolve, reject)
} catch (error) {
reject(error)
}
}
MyPromise.prototype.then = function (onFulflled, onRejected) { // then需要返回一个Promise
let myResolve = undefined, myReject = undefined
let myPromise = new MyPromise((resolve, reject) => { // 通过闭包获取Promise的resolve、reject函数
myResolve = resolve
myReject = reject
})
onFulflled && this.onResolveCallbacks.push(onFulflled)
this.onResolveCallbacks.push(myResolve)
onRejected && this.onRejectCallbacks.push(onRejected)
this.onRejectCallbacks.push(myReject)
return myPromise // 返回一个pending状态的Promise
}
MyPromise.prototype.catch = function (catchFun) {
return this.then(undefined, catchFun)
}