手写promise骨架

var p1 = new Promise((resolve, reject) => {
  resolve(1)
})
p1.then((val) => {
  console.log(val)
}, (reason) => {
  console.log(reason)
})
p1.then(2)
// 通过onfulfulled里面的return的值,修改promise
// x是promise,resolve的值,rejected的reason或者then里面的fulFilled方法执行返回的值
function resolvePromise(promise, x) {
  // x===promise的时候,报错
  // x是promise类型则通过x的状态和值去修改promise的状态和值
  if (isPromise(x)) {
    if (x.status === statusMap.FULFILLED) {

    }
    if (x.status === statusMap.REJECTED) {

    }
    if (x.status === statusMap.PENDING) {

    }
  }

  if (isObject(x) || isFunction(x)) {
    // x是thenable,当作promise去执行
    // 不是thenable,就,当成普通数据类型
  } else {
    //普通数据类型
    fulFilledPromise(promise, x)
  }
}
function fulFilledPromise(promise, value) {
  promise.status = statusMap.FULFILLED
  promise.value = value
}
function rejectPromise(promise, error) {
  promise.status = statusMap.REJECTED
  promise.reason = error
}
function isFunction() {

}
function isPromise() {

}
const statusMap = {
  PENDING: 'pending',
  FULFILLED: 'fulfilled',
  REJECTED: 'rejected'
}
class Promise {
  constructor(fn) {
    this.status = 'pending'
    this.value = undefined
    this.reason = undefined
    this.fulfilledCbs = [] // 当前promise调用then,then里面的onFulfilled
    this.rejectedCbs = [] // 当前promise调用then,then里面的onRjected
    fn((value) => {
      resolvePromise(this, value)
    }, (reason) => {
      rejectPromise(this, reason)
    })
  }

  then(onFulfilled, onRejected) {
    const promise1 = this
    const promise2 = new Promise(() => { })
    if (promise1.status === statusMap.FULFILLED) {
      setTimeout(() => {
        if (!isFunction(onFulfilled)) {
          return promise1
        }
        try {
          const x = onFulfilled(promise1.value)
          resolvePromise(promise2, x)
        } catch (error) {
          rejectPromise(promise2, error)
        }
      }, 0);
    }

    if (promise1.status === statusMap.REJECTED) {
      setTimeout(() => {
        if (!isFunction(onRejected)) {
          return promise1
        }
        try {
          const x = onRejected(promise1.reason)
          resolvePromise(promise2, x)
        } catch (error) {
          rejectPromise(promise2, error)
        }
      }, 0);
    }
    if (promise1.status === statusMap.PENDING) {
      onFulfilled = isFunction(onFulfilled) ? onFulfilled : (value) => {
        return value;
      }
      onRejected = isFunction(onRejected) ? onRejected : (error) => {
        throw error;
      }
      promise1.fulfilledCbs.push(() => {
        setTimeout(() => {
          try {
            const x = onFulfilled(promise1.value)
            resolvePromise(promise2, x)
          } catch (error) {
            rejectPromise(promise2, error)
          }
        }, 0);
      })
      promise1.rejectedCbs.push(() => {
        setTimeout(() => {
          try {
            const x = onRejected(promise1.value)
            resolvePromise(promise2, x)
          } catch (error) {
            rejectPromise(promise2, error)
          }
        }, 0);
      })
    }

    return promise2
  }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值