手写实现简版Promise

手写实现简版Promise

class myPromise {
  constructor(exector) {
    this.status = PROMISE_STATUS_PENDING
    this.value = null
    this.reason = null

    this.onFulfilledfns = []
    this.onRejectedfns = []
    
	//定义resolve回调
    const resolve = value => {
      if (this.status === PROMISE_STATUS_PENDING) {
        this.value = value
        //创建微任务等待then函数调用完
        queueMicrotask(() => {
          this.status = PROMISE_STATUS_FULFILLED
          this.onFulfilledfns.forEach(fn => {
            fn()
          })
        })
      }
    }
    //定义reject回调
    const reject = reason => {
      if (this.status === PROMISE_STATUS_PENDING) {
        this.status = PROMISE_STATUS_REJECTED
        this.reason = reason
        //创建微任务等待then函数调用完
        queueMicrotask(() => {
          this.onRejectedfns.forEach(fn => {
            fn()
          })
        })
      }
    }
    try {
      exector(resolve, reject)
    } catch (err) {
      console.log(err)
    }
  }
  then(onFulFilled, onRejected) {
    //至少传入一个参数,并且成功回调是必传参数
    //不手动调用resolve, promise不会完成,但是逻辑错误的情况下会报错
    //所以给onRejected一个默认值
    const defaultRejected = err => err
    if (!onRejected) {
      onRejected = defaultRejected
    }

    return new myPromise((resolve, reject) => {
      if (this.status === PROMISE_STATUS_FULFILLED && onFulFilled) {
        execFunctionWithCatchError(onFulFilled, this.value, resolve, reject)
      }
      if (this.status === PROMISE_STATUS_REJECTED && onRejected) {
        execFunctionWithCatchError(onRejected, this.reason, resolve, reject)
      }

      if (this.status === PROMISE_STATUS_PENDING) {
        if (onFulFilled) {
          this.onFulfilledfns.push(() => {
            execFunctionWithCatchError(onFulFilled, this.value, resolve, reject)
          })
        }
        if (onRejected) {
          this.onRejectedfns.push(() => {
            execFunctionWithCatchError(onRejected, this.reason, resolve, reject)
          })
        }
      }
    })
  }
  catch(onRejected) {
    return this.then(undefined, onRejected)
  }
}

//封装代码, 处理then函数
function execFunctionWithCatchError(fn, v, resolve, reject) {
  try {
    const res = fn(v)
    resolve(res)
  } catch (err) {
    reject(err)
  }
}



const p = new myPromise((resolve, reject) => {
  resolve('123')
})
p.then(res => {
  console.log(res)
})
p.then(res => {
  console.log(res)
})
p.then(res => {
  console.log(res)
})
setTimeout(() => {
  p.then(res => {
    console.log('------', res)
  })
}, 1000)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值