Promise传入一个构造器,返回一个Promise对象,构造器内有一个resolve和reject方法,分别用来触发promise的成功失败,then内有两个参数,第一个是注册成功的回调,第二个是注册失败的回调函数
function Promise(executor) {
//为什么要用self
//因为promise捕获异步的结果,resolve和reject用来触发成功失败的时候this指向已经改变
let self = this
self.status = 'pending'
self.value = undefined
self.reason = undefined
// 成功回调数组
self.onFulfilled = []
// 失败回调数组
self.onRejected = []
// 一旦promise状态变为成功或者失败就不会在改变
function resolve(value) {
if (self.status !== 'pending') return
self.status = 'resolved'
self.value = value
self.onFulfilled.forEach(fn => fn())
}
function reject(reason) {
if (self.status !== 'pending') return
self.status = 'rejected'
self.reason = reason
self.onRejected.forEach(fn => fn())
}
// 捕获错误,如果Promise实例化出现错误直接执行reject
try {
executor(resolve, reject)
} catch (e) {
reject(e)
}
}
// then函数用来注册成功失败的回调
Promise.prototype.then = function (onFulfilled, onRejected) {
let self = this
// 还在等待结果的时候需要注册到回调数组内
if (self.status === 'pending') {
self.onFulfilled.push(() => {
onFulfilled(self.value)
})
self.onRejected.push(() => {
onRejected(self.reason)
})
}
// 如果调用.then的时候状态已经是resolved了
// 我们直接调用方法,因为之前的数组可能执行过了
// 情况出现在回调完成后,再次调用then的方法
if (self.status === 'resolved') {
onFulfilled(self.value)
}
// 同理上面
if (self.status === 'rejected') {
onRejected(self.reason)
}
}