前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue中异步:Async和await的使用

Vue中异步:Async和await的使用

作者头像
用户9914333
发布2024-02-05 17:31:36
2060
发布2024-02-05 17:31:36
举报
文章被收录于专栏:bug收集bug收集

bug收集:专门解决与收集bug的网站

最近,在写在项目中很多的地方,用到了async和await。

发现了和理解的有些不一样,

下面有几道网上看到的题,大家可以做做,看看和你想的是否一样

代码语言:javascript
复制
async function test() {
    console.log(0)
    await console.log(111);//在第一个await表达式出现之前,异步函数内部的代码都是按照同步方式执行的
    console.log(555)  //倒数第二个输出
    console.log(556665)//最后一个输出
 }
 function test1(){
     console.log(22)
 }
test1();
test();
console.log(10);

输出结果:

总结:异步方法里面await会阻塞该方法内部后续的进程(等待时间比同步方法久,先执行同步方法)

再看以下示例帮助理解:

代码语言:javascript
复制
let x = 0;

async function test() {
    x += await 2;
    console.log(x);  // 输出什么?
}

test();
x = 1;

输出3?还是2?正确答案是:2

首先我们先记住一句话,那就是异步函数(async方式声明的函数)不代表其函数内部的所有代码都是异步方式执行的,这句话什么意思呢?通俗讲就是:在第一个await表达式出现之前,异步函数内部的代码都是按照同步方式执行的,记住这句话以后我们再继续往下看

那么在test函数内部,哪些代码是按同步方式执行的呢?首先我们可以将x += await 2这行代码稍微变换一下形式,变换为:x = x + await 2,表达式右边的x是取值操作,并且按同步方式执行的,所以在执行到await时,右边的x已经取值完成,并且被取到的值0替换,然后才轮到test函数外的x = 1这行代码执行,x += await 2相当于x = 0 + await 2,所以最终输出:2

现在,我们稍微对上面的代码做一下修改:

代码语言:javascript
复制
let x = 0;
async function test() {
    x = (await 2) + x;// 把await放在x前面
    console.log(x);   // 这里又输出什么?
} 
test();
x = 1;

输出:3

原因是:await 2这次被放在了x表达式的前面,所以x的取值操作是异步执行的,也就是说x = 1会先被执行,然后才是test函数中x的取值操作,由于test函数中的x形成了闭包,所以x = (await 2) + x相当于x = (await 2) + 1,所以最终输出:3

结论:

上面代码的关键是:test函数中x的取值操作与x = 1这行代码执行顺序先后的问题,所以我们可以得出一个结论:await会阻塞其所在表达式中后续表达式的执行。

苟有恒 , 何必三更眠五更起

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 bug收集 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档