关于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 相关文章推荐
$()JS小技巧
Jul 21 Javascript
onclick与listeners的执行先后问题详细解剖
Jan 07 Javascript
JS实现FLASH幻灯片图片切换效果的方法
Mar 04 Javascript
使用AngularJS处理单选框和复选框的简单方法
Jun 19 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
Aug 25 Javascript
JavaScript常用代码书写规范的超全面总结
Sep 11 Javascript
AngularJS递归指令实现Tree View效果示例
Nov 07 Javascript
JavaScript图片处理与合成总结
Mar 04 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
Mar 28 jQuery
Vue 动态设置路由参数的案例分析
Apr 24 Javascript
原生js实现针对Dom节点的CRUD操作示例
Aug 26 Javascript
Vuex的实战使用详解
Oct 31 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
图书管理程序(三)
2006/10/09 PHP
php+xml编程之xpath的应用实例
2015/01/24 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
微信小程序 教程之注册页面
2016/10/17 Javascript
简单实现JS计算器功能
2016/12/21 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
vue-dplayer 视频播放器实例代码
2019/11/08 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
Python中的生成器和yield详细介绍
2015/01/09 Python
Python中的多重装饰器
2015/04/11 Python
python使用append合并两个数组的方法
2015/04/28 Python
Django 开发调试工具 Django-debug-toolbar使用详解
2019/07/23 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
2020/01/04 Python
Tensorflow读取并输出已保存模型的权重数值方式
2020/01/04 Python
Python用户自定义异常的实现
2020/12/25 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
高中历史教学反思
2014/02/08 职场文书
质量月活动策划方案
2014/03/10 职场文书
工程造价专业求职信
2014/07/17 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
工作批评与自我批评范文
2014/10/16 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
2015年保送生自荐信
2015/03/24 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
如何把新闻人物写得立体、鲜活?
2019/08/14 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
php+laravel 扫码二维码签到功能
2021/05/15 PHP
Java 将PPT幻灯片转为HTML文件的实现思路
2021/06/11 Java/Android
Ajax实现异步加载数据
2021/11/17 Javascript
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python