MPromise - 2020-08-24

2020-08-24  本文已影响0人  勇敢的小拽马
let promise = new MPromise((resolve, reject) => {
  setTimeout(() => {
    resolve('success')
  }, 2000)
})

promise.then((data) => {
  console.log(data);
  return '999'
}).then((data) => {
  console.log(123);
  console.log(data);
})
class MPromise {
  constructor(fn) {
    this.status = 'PENDING'
    this.value = ''
    this.reason = ''

    this.onFulfilledCallbacks = []
    this.onRejectedCallbacks = []

    let that = this
    function resolve(value) {
      if(that.status === 'PENDING') {
        that.status = 'FULFILLED'
        that.value = value
        that.onFulfilledCallbacks.forEach(callback => {
          callback(that.value)
        }) 
      }
    }
    function reject(reason) {
      if(that.status === 'PENDING') {
        that.status = 'REJECTED'
        that.reason = reason
        that.onRejectedCallbacks.forEach(callback => {
          callback(that.reason)
        }) 
      }
    }

    try {
      fn(resolve, reject)
    } catch(err) {
      reject(err)
    }
  }

  then(onFulfilled, onRejected) {
    let realOnFulfilled = onFulfilled
    let realOnRejected = onRejected
    if(typeof realOnFulfilled !== 'function') {
      realOnFulfilled = (value) => {
        return value
      }
    }
    if(typeof realOnRejected !== 'function') {
      realOnRejected = (reason) => {
        return reason
      }
    }

    let that = this
    if(this.status === 'PENDING') {
      this.onFulfilledCallbacks.push(realOnFulfilled)
      this.onRejectedCallbacks.push(realOnRejected)
    }
    if(this.status === 'FULFILLED') {
      return new MPromise(function(resolve, reject) {
        try {
          realOnFulfilled(that.value)
        } catch(err) {
          reject(err)
        }
      })
    }
    if(this.status === 'REJECTED') {
      return new MPromise(function(resolve, reject) {
        try {
          realOnRejected(that.reason)
        } catch(err) {
          reject(err)
        }
      })
    }
  }

  resolve(parameter) {
    if(parameter instanceof MPromise) {
      return parameter
    }
    return new MPromise((resolve) => {
      resolve(parameter)
    })
  }

  all(promiseList) {
    let resPromise = new MPromise((resolve, reject) => {
      let count = 0
      let result = []
      let length = promiseList.length

      if(length === 0) {
        return resolve(result)
      }

      promiseList.forEach((promise, index) => {
        MPromise.resolve(promise).then((value) => {
          count++
          result[index] = value
          if(count === length) {
            return resolve(result)
          }
        }, (reason) => {
          reject(reason)
        })
      })
    })
    return resPromise
  }
}

https://segmentfault.com/a/1190000023157856

上一篇 下一篇

猜你喜欢

热点阅读