关于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 相关文章推荐
javascript基本语法分析说明
Jun 15 Javascript
举例讲解jQuery中可见性过滤选择器的使用
Apr 18 Javascript
js实现页面刷新滚动条位置不变
Nov 27 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
Feb 12 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
Jun 13 Javascript
vue 1.x 交互实现仿百度下拉列表示例
Oct 21 Javascript
Node.js创建Web、TCP服务器
Dec 05 Javascript
详解小程序用户登录状态检查与更新实例
May 15 Javascript
基于JavaScript判断两个对象内容是否相等
Jan 10 Javascript
Element Input输入框的使用方法
Jul 26 Javascript
vue下载二进制流图片操作
Oct 26 Javascript
vue中封装axios并实现api接口的统一管理
Dec 25 Vue.js
微信小程序实现多行文字滚动
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
使用php+xslt在windows平台上
2006/10/09 PHP
PHP 调试工具Debug Tools
2011/04/30 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
2013/08/16 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
jQuery 使用手册(二)
2009/09/23 Javascript
js动态修改input输入框的type属性(实现方法解析)
2013/11/13 Javascript
AngularJs html compiler详解及示例代码
2016/09/01 Javascript
在Vue组件化中利用axios处理ajax请求的使用方法
2017/08/25 Javascript
JavaScript体验异步更好的解决办法
2018/01/08 Javascript
React组件refs的使用详解
2018/02/09 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
Vue中watch、computed、updated三者的区别及用法
2020/07/27 Javascript
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
查看django执行的sql语句及消耗时间的两种方法
2018/05/29 Python
Python多进程原理与用法分析
2018/08/21 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
Python可迭代对象操作示例
2019/05/07 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
如何用python写个模板引擎
2021/01/14 Python
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
PHP中如何使用Cookie
2015/10/28 面试题
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
《欢乐的泼水节》教学反思
2014/04/22 职场文书
小学运动会口号
2014/06/07 职场文书
图书馆志愿者活动总结
2014/06/27 职场文书
oracle重置序列从0开始递增1
2022/02/28 Oracle