zoukankan      html  css  js  c++  java
  • 手写一个promise

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    <body>
      
    </body>
    <script>
      const PEDDING = 'pedding' 
      const RESOLVE = 'resolve' 
      const REJECT = 'reject'
      function MyPromise(fn){
        const that = this
        that.state = PEDDING
        that.value = null
        that.resolveCallbacks = []
        that.rejectCallbacks = []
        function resolve(value) {
          if(that.state === PEDDING) {
            that.state = RESOLVE
            that.value = value
            that.resolveCallbacks.map(cb => cb(that.value))
          }
        }
        function reject(value) {
          if(that.state === PEDDING) {
            that.state = REJECT
            that.value = value
            that.rejectCallbacks.map(cb => cb(that.value))
          } 
        }
        try {
          fn(resolve, reject)
        }catch(e){
          reject(e)
        } 
      }
      MyPromise.prototype.then = function(onFullfilled, onRejected){
        const that = this
        onFullfilled = typeof onFullfilled === 'function'? onFullfilled : v => v
        onRejected = typeof onRejected === 'function' ? onRejected : r => {
          throw r
        }  
        if (that.state === PEDDING) {
          that.resolveCallbacks.push(onFullfilled)
          that.rejectCallbacks.push(onRejected)
        }
        if(that.state === RESOLVE) {
          onFullfilled(that.value)
        }
        if(that.state === REJECT) {
          onRejected(that.value)
        }
      }
      console.log('script start')
      async function async1() {
        await async2()
        console.log('async1 end')
      }
      function async2() {
        console.log('async2 end')
      }
      async1()
      setTimeout(()=>{
        console.log('settimeout')
      }, 0)
      new MyPromise((resolve) => {
        console.log('promise start')
        resolve()
      }).then(()=>{
        console.log('promise1')
      })
      console.log('script end')
    
    // script start => async2 end => promise start => promise1 => script end => async1 end => settimeout
    </script>
    </html>
    
  • 相关阅读:
    【转】全国各地做生意十年的心得,忍不住上来感慨一下,诚信才是根基!
    pbootcms常用标签
    wordpress常用标签
    表格
    dedecms忘记后台密码
    新手建站基础步骤
    zblog常用插件及操作步骤
    织梦建站如何添加视频文件
    #Centos7.4#Shell中判断语句if中-z至-d的意思
    #Centos7.4#Linux虚拟机KVM配置网卡【Requested operation is not valid: network 'br0' is not active】
  • 原文地址:https://www.cnblogs.com/Jason-lin/p/10282973.html
Copyright © 2011-2022 走看看