【面试题】ES6中await和then的使用及区别

ES6中await和then的使用及区别

点击打开视频教程

使用 .then

<template>
  <div id="app">
    <button @click="fn1">点击f1</button>
  </div>
</template>

<script>
export default {
  name: 'App',
  data(){
    return {
      _fn2:{}
    }
  },
  mounted(){
    this._fn2 = this.fn2()
    console.log(this._fn2);   //返回promise对象,因为async会通过Promise.resolve()把返回值封装成promise对象;
  },
  methods:{

    fn1(){
      this._fn2.then(() => {
        this.fn3()
      })
    },

    async fn2(){
      return 1
    },

    fn3(){
      console.log('1234')
    }

  }
}
</script>

<style scoped>

</style>

现在执行fn1(),结果显示promise和123,执行期间都发生了什么呢?

  • fn2()返回一个promise,在某时刻返回resolve;
  • .then已经被添加到链式回调,在这种情况下,fn1函数执行结束之后,fn1函数并不会暂停,所以在fn2()resolve时,fn1的作用域已经没有了,如果fn2或fn3报错,那么堆栈信息中应该包含fn1函数,但是fn1的作用域已经消失js引擎就会额外记录堆栈信息,记录fn1,把fn1附加到fn2返回的promise中,并往下传递,这样fn3在需要的时候可以被允许获取堆栈信息,降低性能,占用内存。

使用await

<template>
  <div id="app">
    <button @click="a">点击a</button>
  </div>
</template>

<script>
export default {
  name: 'App',
  data(){
    return {
      
    }
  },
  mounted(){
    
  },
  methods:{
    // await使用
    async a(){
      await this.b()
      this.c()
    },
    async b(){
      return 1
    },
    c(){
      console.log('ccc')
    },

  }
}
</script>

<style scoped>

</style>

1.首先执行了await b,然后时c函数,最后打印 ’ccc‘。

2.期间发生了什么?
await b()会暂停它所在的async函数的执行,直到异步的函数b执行结束之后,再执行函数c,await得到promise对象,await阻塞后续的代码,等到promise对象resolve并作为await的结果返回。

3.区别:await不需要保存当前堆栈信息,在执行函数b的时候,函数a暂停执行,作用域仍然存在,如果函数b,c报错,都可以直接生成相对应的堆栈信息,=》速度更快,内存节省。

async 内部的阻塞都在promise对象中异步执行,.then和await在堆栈信息存在区别;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咬着拽天下的程序猿

心若释然,何惧万水千山!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值