前言

虽然大家知道async/await,但是很多人对这个方法中内部怎么执行的还不是很了解,本文是我看了一遍技术博客理解 JavaScript 的 async/await(如果对async/await不熟悉可以先看下这篇文章)后拓展了一下,我理了一下await之后js的执行顺序,希望可以给别人解疑答惑,先简单介绍一下async/await。
async怎么处理返回值
async function testAsync() {
return "hello async";
}
let result = testAsync();
console.log(result)
输出结果:
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "hello async"}
从结果中可以看到async函数返回的是一个promise对象,如果在函数中 return 一个直接量,async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象。
如果asyn函数没有返回值
async function testAsync1() {
console.log("hello async");
}
let result1 = testAsync1();
console.log(result1);
结果
hello async
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: undefined}
结果返回Promise.resolve(undefined) 。
await做了什么处理
从字面意思上看await就是等待,await 等待的是一个表达式,这个表达式的返回值可以是一个promise对象也可以是其他值。
很多人以为await会一直等待之后的表达式执行完之后才会继续执行后面的代码,实际上await是一个让出线程的标志。await后面的函数会先执行一遍,然后就会跳出整个async函数来执行后面js栈(后面会详述)的代码。等本轮事件循环执行完了之后又会跳回到async函数中等待await
后面表达式的返回值,如果返回值为非promise则继续执行async函数后面的代码,否则将返回的promise放入promise队列(Promise的Job Queue)
async/await 执行顺序
先看一个例子
function testSometing() {
console.log("执行testSometing");
return "testSometing";
}
async function testAsync() {
console.log("执行testAsync");
return Promise.resolve("hello async");
}
async function test() {
console.log("test start...");
const v1 = await testSometing();//关键点1
console.log(v1);
const v2 = await testAsync();
console.log(v2);
console.log(v1, v2);
}
test();
var promise = new Promise((resolve)=> { console.log("promise start.."); resolve("promise");});//关键点2
promise.then((val)=> console.log(val));
console.log("test end...")
输出结果:
test start... 执行testSometing promise start.. test end... testSometing 执行testAsync promise hello async testSometing hello async
当test函数执行到
const v1 = await testSometing();
的时候,会先执行testSometing这个函数打印出“执行testSometing”的字符串,然后因为await会让出线程就会区执行后面的
var promise = new Promise((resolve)=> { console.log("promise
start.."); resolve("promise");});//关键点2
然后打印出“promise start..”接下来会把返回的这promise放入promise队列(Promise的Job Queue),继续执行打印“test end...”,等本轮事件循环执行结束后,又会跳回到async函数中(test函数),等待之前await 后面表达式的返回值,因为testSometing 不是async函数,所以返回的是一个字符串“testSometing”,test函数继续执行,执行到
const v2 = await testAsync();
和之前一样又会跳出test函数,执行后续代码,此时事件循环就到了promise的队列,执行promise.then((val)=> console.log(val));then后面的语句,之后和前面一样又跳回到test函数继续执行。
这个就是在async/await 函数之后js的执行顺序,我们再看一个列子把testSometing函数前面加上async
async function testSometing() {
console.log("执行testSometing");
return "testSometing";
}
async function testAsync() {
console.log("执行testAsync");
return Promise.resolve("hello async");
}
async function test() {
console.log("test start...");
const v1 = await testSometing();
console.log(v1);
const v2 = await testAsync();
console.log(v2);
console.log(v1, v2);
}
test();
var promise = new Promise((resolve)=> { console.log("promise start.."); resolve("promise");});//3
promise.then((val)=> console.log(val));
console.log("test end...")
输出结果:
test start... 执行testSometing promise start.. test end... promise testSometing 执行testAsync hello async testSometing hello async
和上一个例子比较发现promise.then((val)=> console.log(val));先与console.log(v1);执行了,原因是因为现在testSometing函数加了async,返回的是一个Promise对象要要等它resolve,所以将当前Promise推入队列,所以会继续跳出test函数执行后续代码。之后就开始执行promise的任务队列了,所以先执行了promise.then((val)=> console.log(val));因为这个Promise对象先推入队列;
总结
写到这里大家应该已经清楚了使用async/await进行异步操作时js的执行顺序,在研究过程中还发现了js的任务队列执行顺序的问题,就下次再述。如果大家对有什么意见或建议可以指出。本篇是我第一次发布文章,希望大家不吝赐教。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# js
# async
# await
# JS中async/await实现异步调用的方法
# JavaScript中的await/async的作用和用法
# 在JS循环中使用async/await的方法
# JS中的async与await怎么使用
# JS循环中正确使用async、await的姿势分享
# js异步之async和await实现同步写法
# JavaScript async/await的使用场景与规范
# 的是
# 返回值
# 又会
# 是一个
# 就会
# 一遍
# 列子
# 会把
# 这篇文章
# 跳回
# 先看
# 本轮
# 会先
# 有什么
# 是一种
# 是因为
# 好了
# 不吝赐教
# 基础上
# 才会
相关文章:
成都网站制作报价公司,成都工业用气开户费用?
如何快速搭建响应式可视化网站?
,网页ppt怎么弄成自己的ppt?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
如何在建站之星网店版论坛获取技术支持?
如何在云主机快速搭建网站站点?
C#如何序列化对象为XML XmlSerializer用法
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
专业公司网站制作公司,用什么语言做企业网站比较好?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
建站之星北京办公室:智能建站系统与小程序生成方案解析
制作表格网站有哪些,线上表格怎么弄?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
代购小票制作网站有哪些,购物小票的简要说明?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
建站主机如何选?性能与价格怎样平衡?
网页设计与网站制作内容,怎样注册网站?
如何做网站制作流程,*游戏网站怎么搭建?
微课制作网站有哪些,微课网怎么进?
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
红河网站制作公司,红河事业单位身份证如何上传?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
小程序网站制作需要准备什么资料,如何制作小程序?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
如何通过虚拟主机快速搭建个人网站?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
如何用已有域名快速搭建网站?
完全自定义免费建站平台:主题模板在线生成一站式服务
如何在橙子建站上传落地页?操作指南详解
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
专业网站建设制作报价,网页设计制作要考什么证?
建站之星安装路径如何正确选择及配置?
韩国服务器如何优化跨境访问实现高效连接?
建站之星展会模版如何一键下载生成?
建站之星好吗?新手能否轻松上手建站?
如何在腾讯云服务器上快速搭建个人网站?
建站之星后台密码遗忘或太弱?如何重置与强化?
专业商城网站制作公司有哪些,pi商城官网是哪个?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
建站主机空间推荐 高性价比配置与快速部署方案解析
网站制作难吗安全吗,做一个网站需要多久时间?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
如何选择PHP开源工具快速搭建网站?
制作宣传网站的软件,小红书可以宣传网站吗?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
*请认真填写需求信息,我们会在24小时内与您取得联系。