JS手写Promise代码ES6方式实现

本篇只简单实现Promise,不包含链式调用等。若想详细了解请参考链接,由于Promise实现采用了发布订阅模式,所以想要了解原理的可以参考观察者模式和发布订阅模式的区别

代码实现

const STATUS = {
    PENDING: 'pending',
    FULFILLED: 'fulFilled',
    REJECTED: 'rejected'
}

class MyPromise {
    constructor(executor) {
        this.status = STATUS.PENDING    // 状态值
        this.value = undefined          // 成功返回值
        this.reason = undefined         // 失败返回值
        this.onFulFilledCallbacks = []  // 成功回调执行队列----up
        this.onRejectedCallbacks = []   // 失败回调执行队列----up

        // 成功
        const resolve = (val) => {
            // PENDING用来屏蔽的,resolve和reject只能调用一个,不能同时调用
            if (this.status === STATUS.PENDING) {
                this.status = STATUS.FULFILLED
                this.value = val
                this.onFulFilledCallbacks.forEach(fn => fn())   // ----up
            }
        }
        // 是失败
        const reject = (reason) => {
            if (this.status === STATUS.PENDING) {
                this.status = STATUS.REJECTED
                this.reason = reason
                this.onRejectedCallbacks.forEach(fn => fn())   // ----up
            }
        }

        try {
            executor(resolve, reject)
        } catch (e) {
            reject(e)
        }
    }

    then(onFullFilled, onRejected) {
        // 同步调用判断
        if (this.status === STATUS.FULFILLED) {
            onFullFilled(this.value)
        }
        if (this.status === STATUS.REJECTED) {
            onRejected(this.reason)
        }
        // 异步调用判断 ----up
        if (this.status === STATUS.PENDING) {
            this.onFulFilledCallbacks.push(() => {
                onFullFilled(this.value)
            })
            this.onRejectedCallbacks.push(() => {
                onRejected(this.reason)
            })
        }
    }
}

// const p = new MyPromise((resolve, reject) => {
//     // resolve('success')   // 走了成功就不会走失败了
//     // throw new Error('失败') // 失败了就走resolve
//     // reject('failed')       // 走了失败就不会走成功
//     resolve('成功!')
// })
// p.then((res) => {
//     console.log(res)
// }, (err) => {
//     console.log(err)
// })

const p = new MyPromise((resolve, reject) => {
    setTimeout(function() {
        resolve('success')
    }, 1000)
})
p.then((res) => {
    console.log(res)
}, (err) => {
    console.log(err)
})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值