关于JavaScript中异步/等待的用法与理解


Posted in Javascript onNovember 18, 2020

昨天更新的是“JavaScript中的Promise使用详解”,其实也就是说了下基本用法和自己对Promise的理解,可能有错误之处,也欢迎指出。今天就说一说“JavaScript中的async/await的用法和理解”

JavaScript中异步/等待的用法和理解

编程语言中任意一个关键字都是有意义的,我们先从字面意思来理解。

1.async

async 是“异步”的简写,带async关键字的函数,是声明异步函数,返回值是promise对象,如果async关键字函数返回的不是promise,会自动用Promise.resolve()包装。

async function test() {
 return 'hello word'
}
test();

运行上面代码返回结果如下

2.await

await 可以认为是 async wait 的简写。所以应该很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。

如果它等到的不是一个 Promise 对象,那 await 表达式的运算结果就是它等到的东西。

如果它等到的是一个 Promise 对象,await 就忙起来了,它会阻塞后面的代码,等着 Promise 对象 resolve,然后得到 resolve 的值,作为 await 表达式的运算结果。

我们看下面段代码

function test() {
 return new Promise(resolve => {
  setTimeout(() => resolve("hello word"), 2000);
 });
}

const result = test();
console.log(result.then((val)=>{console.log(val)}));
console.log('结束')

我们以编辑器编辑器代码执行顺序来理下,

1.首先我们定义一个方法,这个方法返回Promise 对象,.then()函数两秒钟后返回调用成功。

2.接下来实例化test()函数。

3.调用result对象的then()函数,接收返回值,注意,这里是异步的

4.打印日志结束

我们运行代码,看结果

看到先打印“结束”,然后才打印的“hello word”,这就是异步,我们改造下代码

function test() {
 return new Promise(resolve => {
  setTimeout(() => resolve("hello word"), 2000);
 });
}

const result = await test();
console.log(result);
console.log('结束')

用await关键字接test()函数,看这次返回结果

我们发现先打印“hello word”,然后才打印“结束”,由于test()造成的阻塞,console.log(‘结束')会等到两秒后执行。

再来说下优缺点

优点:相对于promise,async/await处理 then 的调用链,代码要清晰很多,几乎和同步代码一样。

缺点:滥用 await 可能会导致性能问题,因为 await 会阻塞代码。

总结

到此这篇关于JavaScript中异步/等待的用法与理解的文章就介绍到这了,更多相关JavaScript异步/等待的用法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
IE事件对象(The Internet Explorer Event Object)
Jun 27 Javascript
如何在一个页面显示多个百度地图
Apr 07 Javascript
使用js解决由border属性引起的div宽度问题
Nov 26 Javascript
JavaScript实现数字数组按照倒序排列的方法
Apr 06 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
Aug 04 Javascript
Javascript 字符串模板的简单实现
Feb 13 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
Feb 08 Javascript
详解Angular5 服务端渲染实战
Jan 04 Javascript
JavaScript制作3D旋转相册
Aug 02 Javascript
echarts实现折线图的拖拽效果
Dec 19 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
Mar 16 Javascript
Javascript中的解构赋值语法详解
Apr 02 Javascript
微信小程序实现多行文字滚动
Nov 18 #Javascript
微信小程序实现自定义底部导航
Nov 18 #Javascript
微信小程序绘制半圆(弧形)进度条
Nov 18 #Javascript
微信小程序实现加入购物车滑动轨迹
Nov 18 #Javascript
Map与WeakMap类型在JavaScript中的使用详解
Nov 18 #Javascript
解决js中的setInterval清空定时器不管用问题
Nov 17 #Javascript
springboot+vue实现文件上传下载
Nov 17 #Vue.js
You might like
session 的生命周期是多长
2006/10/09 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
2019/03/21 PHP
JQuery做的一个简单的点灯游戏分享
2014/07/16 Javascript
DOM 事件流详解
2015/01/20 Javascript
jquery图片切换插件
2015/03/16 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
js实现简单页面全屏
2019/09/17 Javascript
[03:47]2015国际邀请赛第三日现场精彩回顾
2015/08/08 DOTA
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
在Docker上部署Python的Flask框架的教程
2015/04/08 Python
Python使用django获取用户IP地址的方法
2015/05/11 Python
如何通过命令行进入python
2020/07/06 Python
Python实现壁纸下载与轮换
2020/10/19 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
国际书籍零售商:Wordery
2017/11/01 全球购物
澳大利亚领先的在线机械五金、园艺和存储专家:Edisons
2018/03/24 全球购物
自荐信格式范文
2013/10/07 职场文书
医院护士专业个人的求职信
2013/12/09 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
故意杀人罪辩护词
2015/05/21 职场文书
师德师风培训感言
2015/08/03 职场文书
辞职离别感言
2015/08/04 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript
JS的深浅复制详细
2021/10/16 Javascript
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL