美文网首页
一步步手写Promise 2

一步步手写Promise 2

作者: 我就是要学习 | 来源:发表于2020-03-19 11:36 被阅读0次

    then的基础构建

    class MyPromise {
      static PENDING = "pending"
      static FULFILLED = "fulfilled"
      static REJECTED = "rejected"
      
      constructor(executor) {
        this.status = MyPromise.PENDING
        this.value = null
        
        try {
          executor(this.resolve.bind(this), this.reject.bind(this))
        } catch (e) {
          this.reject(e)
        }
      }
      
      resolve(value) {
        if (this.status === MyPromise.PENDING) {
          this.status = MyPromise.FULFILLED
          this.value = value
        }
      }
      
      reject(reason) {
        if (this.status === MyPromise.PENDING) {
          this.status = MyPromise.REJECTED
          this.value = reason
        }
      }
      
      then(onFulfilled, onRejected) {
        if (typeof onFulfilled !== "function") {
          onFulfilled = () => {
          }
        }
        if (typeof onRejected !== "function") {
          onRejected = () => {
          }
        }
        if (this.status === MyPromise.FULFILLED) {
          try {
            onFulfilled(this.value)
          } catch (e) {
            onRejected(e)
          }
        }
        if (this.status === MyPromise.REJECTED) {
          try {
            onRejected(this.value)
          } catch (e) {
            onRejected(e)
          }
        }
      }
    }
    
      let p = new MyPromise((resolve, reject) => {
        // resolve("解决")
        reject("失败")
      }).then(value => {
        console.log(value)
      }, reason => {
        console.log("reason:"+reason);
      })
    //reason:失败
    </script>
    

    对比原生Promise会发现MyPromise是同步执行的

    <script>
      let p = new MyPromise((resolve, reject) => {
        resolve("MyPromise")
      }).then(value => {
        console.log(value);
      })
      console.log("111111111")
      
      let p2 = new Promise(resolve => {
        resolve("原生promise")
      }).then(value => console.log(value))
      
      console.log("22222222222")
      //MyPromise
      //111111111
      //22222222222
      //原生promise
    </script>
    

    将任务放到任务队列中

    class MyPromise {
      static PENDING = "pending"
      static FULFILLED = "fulfilled"
      static REJECTED = "rejected"
      
      constructor(executor) {
        this.status = MyPromise.PENDING
        this.value = null
        
        try {
          executor(this.resolve.bind(this), this.reject.bind(this))
        } catch (e) {
          this.reject(e)
        }
      }
      
      resolve(value) {
        if (this.status === MyPromise.PENDING) {
          this.status = MyPromise.FULFILLED
          this.value = value
        }
      }
      
      reject(reason) {
        if (this.status === MyPromise.PENDING) {
          this.status = MyPromise.REJECTED
          this.value = reason
        }
      }
      
      then(onFulfilled, onRejected) {
        if (typeof onFulfilled !== "function") {
          onFulfilled = () => {
          }
        }
        if (typeof onRejected !== "function") {
          onRejected = () => {
          }
        }
        if (this.status === MyPromise.FULFILLED) {
          setTimeout(() => {
            try {
              onFulfilled(this.value)
            } catch (e) {
              onRejected(e)
            }
          })
        }
        if (this.status === MyPromise.REJECTED) {
          setTimeout(() => {
            try {
              onRejected(this.value)
            } catch (e) {
              onRejected(e)
            }
          })
        }
      }
    }
    

    相关文章

      网友评论

          本文标题:一步步手写Promise 2

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