美文网首页
手写一个Promise

手写一个Promise

作者: 六寸光阴丶 | 来源:发表于2020-04-14 16:21 被阅读0次

写在前面

如果本文对您有所帮助,就请点个关注吧!

手写一个Promise

源代码

const reslovePromise = (promise2, x, reslove, reject) => {
  if (promise2 === x) {
    return reject(new TypeError('Chaining cycle detected for promise #<Promise>'))
  }
  if (x instanceof iPromise) {
    x.then.call(x, res => {
      reslovePromise(promise2, res, reslove, reject)
    }, err => {
      reject(err)
    })
  } else {
    reslove(x)
  }
}

class iPromise {
  constructor(executor) {
    this.state = 'pending'
    this.value = undefined
    this.reason = undefined
    this.onResolvedCallbacks = []
    this.onRejectedCallbacks = []

    const reslove = value => {
      if (value instanceof iPromise) {
        return value.then(reslove, reject)
      }
      setTimeout(() => {
        if (this.state === 'pending') {
          this.state = 'fulfilled'
          this.value = value
          this.onResolvedCallbacks.forEach(fn => fn())
        }
      }, 0)
    }

    const reject = reason => {
      setTimeout(() => {
        if (this.state === 'pending') {
          this.state = 'rejected'
          this.reason = reason
          this.onRejectedCallbacks.forEach(fn => fn())
        }
      }, 0)
    }

    executor(reslove, reject)
  }

  then(onFulfilled, onRejected) {
    const promise2 = new iPromise((reslove, reject) => {
      if (this.state === 'pending') {
        this.onResolvedCallbacks.push(() => {
          setTimeout(() => {
            const x = onFulfilled(this.value)
            reslovePromise(promise2, x, reslove, reject)
          }, 0)
        })
        this.onRejectedCallbacks.push(() => {
          setTimeout(() => {
            const x = onRejected(this.reason)
            reslovePromise(promise2, x, reslove, reject)
          }, 0)
        })
      }
      if (this.state === 'fulfilled') {
        setTimeout(() => {
          const x = onFulfilled(this.value)
          reslovePromise(promise2, x, reslove, reject)
        }, 0)
      }
      if (this.state === 'rejected') {
        setTimeout(() => {
          const x = onRejected(this.reason)
          reslovePromise(promise2, x, reslove, reject)
        }, 0)
      }
    })
    return promise2
  }

  static reslove(value) {
    return new iPromise((reslove, reject) => {
      reslove(value)
    })
  }

  static reject(reason) {
    return new iPromise((reslove, reject) => {
      reject(reason)
    })
  }

  static race(promises) {
    return new iPromise((resolve, reject) => {
      promises.forEach(promise => {
        promise.then(resolve, reject)
      })
    })
  }
  
  static all(promises) {
    return new Promise((res, rej) => {
      var arr = []
      var times = 0;
      function processResult(index, result) {
        arr[index] = result
        times++;
        if (times == promiseArr.length) {
          res(arr)
        }
      }

      for (let i = 0; i < promises.length; i++) {
        var oPromise = promises[i];
        if (typeof oPromise.then == 'function') {
          oPromise.then(function (val) {
            processResult(i, val)
          }, function (reason) {
            rej(reason)
          })
        } else {
          processResult(i, oPromise)
        }
      }
    })
  }
}

相关文章

  • 手写Promise

    手写 Promise 我们会通过手写一个符合 Promise/A+ 规范的 Promise 来深入理解它,并且手写...

  • 手写promise

    手写promise 带大家手写一个 promis。在手写之前我会先简单介绍一下为什么要使用promise、prom...

  • es5 手写promise

    参考自 前端精髓--手写一个Promise

  • 手写 Promise 系列 --- 3

    在前两篇(手写 Promise 系列 --- 1)和(手写 Promise 系列 ---2) 中,达成了3个目标 ...

  • 手写Promise

    $ 正常的promise用法   $ 手写的Promise   # 测试可行性

  • 纯手写实现自己的nodejs promise 库

    纯手写实现自己的nodejs promise 库什么是Promise?promise 链Async/Await后续...

  • 手写基础 promise

    1. 前言 玩下吧 手写 promise,看看能写成啥样 2. promise 基础结构 3. 手写`promi...

  • 手写promise

    promise 手写 代码来源:darrell-wheels promise 30分钟,带你实现一个符合规范的 P...

  • JS常见手写代码题(二)

    1、用闭包手写一个cache工具 2、手写一个简易的JQuery,考虑插件和扩展性 3、手写Promise加载一张...

  • 手写简易Promise

    promise的用法 手写promise需要注意的地方1)接受一个函数(后文称为executor函数)作为参数,e...

网友评论

      本文标题:手写一个Promise

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