关于promise用法示例及实现原理

18 篇文章 0 订阅
18 篇文章 2 订阅

1.用法示例

    lilei('yo~~').then(hanmeimei).then(liming)
    
    function lilei(bang){
      return new Promise((open)=>{
        console.log('李雷起跑')
        setTimeout(() => {
          console.log('李雷到达终点')
          console.log(bang)
          open(bang)
        }, 5000);
      })
    }
    function hanmeimei(bang){
      return new Promise((open)=>{
        console.log('韩梅梅起跑')
        setTimeout(() => {
          console.log('韩梅梅到达终点')
          console.log(bang)
          open(bang)
        }, 5000);
      })
    }
    function liming(bang){
      return new Promise((open)=>{
        console.log('李明起跑')
        setTimeout(() => {
          console.log('李明到达终点')
          console.log(bang)
          console.log('结束')
          open(bang)
        }, 5000);
      })
    }

2.ES7写法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
            // ES7写法
            (async function(){ // 代替.then的写法
                var bang = await lilei('yo~')
                //       ← open(bang)  给open的值相当于return
                bang = await hanmeimei(bang)
                //   ← open(bang)  给open的值相当于return
                await liming(bang)
            })()
             
            // lilei('yo~~~').then(hanmeimei).then(liming)
            function lilei(bang){
                return new Promise((open)=>{
                    console.log('李雷起跑')
                    setTimeout(() => {
                        console.log('李雷到达终点')
                        console.log(bang)
                        open(bang)
                    }, 5000);
                })
            }

            function hanmeimei(bang){
                return new Promise((open)=>{
                    console.log('韩梅梅起跑')
                    setTimeout(() => {
                        console.log('韩梅梅到达终点')
                        console.log(bang)
                        open(bang)
                    }, 5000);
                })
            }

            function liming(bang){
                return new Promise((open)=>{
                    console.log('李明起跑')
                    setTimeout(() => {
                        console.log('李明到达终点')
                        console.log(bang)
                        console.log('结束')
                        open(bang)
                    }, 5000);
                })
            }
    </script>
</body>
</html>

3.实现promise原理

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    function MyPromise(task){
      console.log('enter MyPromise')
      var self = this // 获得当前对象

      self.status = 'pending' // 在对象内部,维持一个状态变量,默认pending,说明不能继续下一项任务;如果状态为open,说明可以继续下一项任务
      self.data // promise要交给下一项任务的参数值
      self.nextTask // 保存下一项任务
      // 定义open函数,其中包含打开开关时要执行的操作
      // 将open函数交给当前任务,在当前任务内,等执行完自动调用open
      function open(data){
        // 如果状态为pending,先改为open
        if(self.status === 'pending'){
          self.status = 'open'
          // 调用提前保存好的then给的下一项任务函数,并将open的参数,继续传递给下一个任务
          if(typeof self.nextTask === 'function'){
            self.nextTask(data)
          }
        }
      }
      task(open)
    }

    MyPromise.prototype.then = function(nextTask){
      // 当用当前对象调用then时,将then中的下一个任务函数保存到当前对象的nextTask变量,等待执行
      this.nextTask = nextTask
    }

    lilei('yo~~').then(hanmeimei)
    function lilei(bang){
      return new MyPromise((open)=>{
        console.log('李雷起跑')
        setTimeout(() => {
          console.log('李雷到达终点')
          console.log(bang)
          open(bang)
        }, 5000);
      })
    }
    function hanmeimei(bang){
      return new MyPromise((open)=>{
        console.log('韩梅梅起跑')
        setTimeout(() => {
          console.log('韩梅梅到达终点')
          console.log(bang)
          open(bang)
        }, 5000);
      })
    }
    function liming(bang){
      return new MyPromise((open)=>{
        console.log('李明起跑')
        setTimeout(() => {
          console.log('李明到达终点')
          console.log(bang)
          console.log('结束')
          open(bang)
        }, 5000);
      })
    }
  </script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值