关于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无缝滚动代码
Jan 03 Javascript
取选中的radio的值
Jan 11 Javascript
js网页中的(运行代码)功能实现思路
Feb 04 Javascript
怎么选择Javascript框架(Javascript Framework)
Nov 22 Javascript
D3.js中data(), enter() 和 exit()的问题详解
Aug 17 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
Oct 14 Javascript
JQuery学习总结【二】
Dec 01 Javascript
jQuery实现百度登录框的动态切换效果
Apr 21 jQuery
jQuery Collapse1.1.0折叠插件简单使用
Aug 28 jQuery
vue中实现图片和文件上传的示例代码
Mar 16 Javascript
Angular 利用路由跳转到指定页面的指定位置方法
Aug 31 Javascript
JavaScript arguments.callee作用及替换方案详解
Sep 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
用PHP发电子邮件
2006/10/09 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
教大家制作简单的php日历
2015/11/17 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
php实现的http请求封装示例
2016/11/08 PHP
CI框架AR数据库操作常用函数总结
2016/11/21 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
浅谈PHP中的面向对象OOP中的魔术方法
2017/06/12 PHP
JS简单的图片放大缩小的两种方法
2013/11/11 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
vue瀑布流组件实现上拉加载更多
2020/03/10 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
基于element-ui封装表单金额输入框的方法示例
2021/01/06 Javascript
Python 基础知识之字符串处理
2017/01/06 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
Pytorch的mean和std调查实例
2020/01/02 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
会计电算化学生个人的自我评价
2014/02/08 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
运动会宣传口号
2014/06/09 职场文书
英文商务邀请函范文
2015/01/31 职场文书
2016年春季运动会通讯稿
2015/11/25 职场文书
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP
SQL Server中常用截取字符串函数介绍
2022/03/16 SQL Server
源码安装apache脚本部署过程详解
2022/09/23 Servers