美文网首页
MPromise - 2020-08-24

MPromise - 2020-08-24

作者: 勇敢的小拽马 | 来源:发表于2020-08-24 20:39 被阅读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

相关文章

网友评论

      本文标题:MPromise - 2020-08-24

      本文链接:https://www.haomeiwen.com/subject/ikpujktx.html