关于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 纠正 cleanWhitespace函数
Mar 11 Javascript
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
Jul 31 Javascript
Js 回车换行处理的办法及replace方法应用
Jan 24 Javascript
js获取url中指定参数值的示例代码
Dec 14 Javascript
JS实现简单路由器功能的方法
May 27 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
Aug 21 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
Nov 10 Javascript
浅谈jquery中next与siblings的区别
Oct 27 Javascript
原生js实现弹出层登录拖拽功能
Dec 05 Javascript
js中时间格式化的几种方法
Jul 22 Javascript
ES6中Symbol、Set和Map用法详解
Aug 20 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
Apr 10 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新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
微信公众号开发之文本消息自动回复php代码
2016/08/08 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
基于php双引号中访问数组元素报错的解决方法
2018/02/01 PHP
PDO::getAvailableDrivers讲解
2019/01/28 PHP
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
2015/06/19 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
js实现登录与注册界面
2017/11/01 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
2017/12/22 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
python实现黑客字幕雨效果
2018/06/21 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
2019/04/09 Python
对于Python深浅拷贝的理解
2019/07/29 Python
Python 通过截图匹配原图中的位置(opencv)实例
2019/08/27 Python
在vscode中配置python环境过程解析
2019/09/28 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
2020/04/17 Python
python安装后的目录在哪里
2020/06/21 Python
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
幼儿园托班开学寄语
2014/01/18 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
房屋质量投诉书
2015/07/02 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS
Windows安装Anaconda3的方法及使用过程详解
2021/06/11 Python
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL