关于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面象对象成员、共享成员变量实验
Nov 19 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
Jun 16 Javascript
浅谈JS闭包中的循环绑定处理程序
Nov 09 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
Jan 21 Javascript
javascript设计模式之对象工厂函数与构造函数详解
Jul 30 Javascript
深入解析JavaScript中的数字对象与字符串对象
Oct 21 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
Jul 28 Javascript
jquery radio的取值_radio的选中_radio的重置方法
Sep 20 Javascript
原生js中ajax访问的实例详解
Sep 19 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
Jul 30 Javascript
Vue 配合eiement动态路由,权限验证的方法
Sep 26 Javascript
js中this的指向问题归纳总结
Nov 28 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
php中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
详解php的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
PHP实现适用于文件内容操作的分页类
2016/06/15 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
javascript设置文本框光标的方法实例小结
2016/11/04 Javascript
javascript实现消灭星星小游戏简单版
2016/11/15 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
[13:56]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第一场
2018/04/06 DOTA
python正则分组的应用
2013/11/10 Python
python修改注册表终止360进程实例
2014/10/13 Python
连接Python程序与MySQL的教程
2015/04/29 Python
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
在Python中操作时间之tzset()方法的使用教程
2015/05/22 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
Python函数参数类型及排序原理总结
2019/12/19 Python
Python魔法方法 容器部方法详解
2020/01/02 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
2020/02/24 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
HTML5 与 XHTML2
2008/10/17 HTML / CSS
yy结婚证婚词
2014/01/10 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
出纳工作检讨书
2014/10/18 职场文书
2014年圣诞节寄语
2014/12/08 职场文书
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript