Promise

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)
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容