实现一个简易的promise

class MyPromise {
      state = 'pending'
      value = undefined
      reason = undefined
      resolveCallbacks = []
      rejectCallbacks = []

      constructor(fn) {
        const resolveHandler = (value) => {
          if(this.state === 'pending') {
            this.state = 'fulfilled'
            this.value = value
            this.resolveCallbacks.forEach(fn => fn(this.value))
          }
        }

        const rejectHandler = (reason) => {
          if(this.state === 'pending') {
            this.state = 'rejected'
            this.reason = reason
            this.rejectCallbacks.forEach(fn => fn(this.value))
          }
        }

        try {
          fn(resolveHandler, rejectHandler)
        } catch (error) {
          rejectHandler(error)
        }
      }

      then(fn1, fn2) {
        fn1 = typeof fn1 === 'function' ? fn1 : (v)  => v
        fn2 = typeof fn2 === 'function' ? fn2 : (e)  => e

        if(this.state === 'pending') {
          const p1 = new MyPromise((resolve, reject) => {
            this.resolveCallbacks.push(() => {
              try {
                const newValue = fn1(this.value)
                resolve(newValue)
              } catch (error) {
                reject(error)
              }
            })

            this.rejectCallbacks.push(() => {
              try {
                const newReason = fn2(this.reason)
                resolve(newReason)
              } catch (error) {
                reject(error)
              }
            })
          })
          return p1
        }
        if(this.state === 'fulfilled') {
          const p1 = new MyPromise((resolve, reject) => {
            try {
              const newValue = fn1(this.value)
              resolve(newValue)
            } catch (error) {
              reject(error)
            }
          })
          return p1
        }
        if(this.state === 'rejected') {
          const p1 = new MyPromise((resolve, reject) => {
            try {
              const newReason = fn2(this.reason)
              resolve(newReason)
            } catch (error) {
              reject(error)
            }
          })
          return p1
        }
      }

      catch(fn) {
        return this.then(null, fn)
      }
    }
    //测试
    const p1 = new MyPromise((resolve, reject) => {
      resolve(100)
    })
    p1.then(data => {
      console.log(data)
      return data + 1
    })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值