关于async/await、promise和setTimeout执行顺序

关于async/await、promise和setTimeout执行顺序

async function async1() {
	console.log('async1 start');
	await async2();
	console.log('asnyc1 end');
}
async function async2() {
	console.log('async2');
}
console.log('script start');
setTimeout(() => {
	console.log('setTimeOut');
}, 0);
async1();
new Promise(function (reslove) {
	console.log('promise1');
	reslove();
}).then(function () {
	console.log('promise2');
})
console.log('script end');

script start
async1 start
async2
promise1
script end
asnyc1 end
promise2
undefined
setTimeOut

js EventLoop 事件循环机制:
JavaScript的事件分两种,宏任务(macro-task)和微任务(micro-task)

  • 宏任务:包括整体代码script,setTimeout,setInterval
  • 微任务:Promise.then(非new Promise),process.nextTick(node中)

事件的执行顺序,是先执行宏任务,然后执行微任务,这个是基础,任务可以有同步任务和异步任务,同步的进入主线程,异步的进入Event Table并注册函数,异步事件完成后,会将回调函数放入Event Queue中(宏任务和微任务是不同的Event Queue),同步任务执行完成后,会从Event Queue中读取事件放入主线程执行,回调函数中可能还会包含不同的任务,因此会循环执行上述操作。
注意: setTimeOut并不是直接的把你的回掉函数放进上述的异步队列中去,而是在定时器的时间到了之后,把回掉函数放到执行异步队列中去。如果此时这个队列已经有很多任务了,那就排在他们的后面。这也就解释了为什么setTimeOut为什么不能精准的执行的问题了。setTimeOut执行需要满足两个条件:

1. 主进程必须是空闲的状态,如果到时间了,主进程不空闲也不会执行你的回掉函数 
2. 这个回掉函数需要等到插入异步队列时前面的异步函数都执行完了,才会执行 

解释:

了解了什么是宏任务和微任务,就好理解多了,首先执行 宏任务 => 微任务的Event Queue => 宏任务的Event Queue

promise、async/await

  • 首先,new Promise是同步的任务,会被放到主进程中去立即执行。而.then()函数是异步任务会放到异步队列中去,那什么时候放到异步队列中去呢?当你的promise状态结束的时候,就会立即放进异步队列中去了。

  • 带async关键字的函数会返回一个promise对象,如果里面没有await,执行起来等同于普通函数;如果没有await,async函数并没有很厉害是不是

  • await 关键字要在 async 关键字函数的内部,await 写在外面会报错;await如同他的语意,就是在等待,等待右侧的表达式完成。此时的await会让出线程,阻塞async内后续的代码,先去执行async外的代码。等外面的同步代码执行完毕,才会执行里面的后续代码。就算await的不是promise对象,是一个同步函数,也会等这样操作

在这里插入图片描述

根据图片显示我们来整理一下流程:

1、执行console.log(‘script start’),输出script start;
2、执行setTimeout,是一个异步动作,放入宏任务异步队列中;
3、执行async1(),输出async1 start,继续向下执行;
4、执行async2(),输出async2,并返回了一个promise对象,await让出了线程,把返回的promise加入了微任务异步队列,所以async1()下面的代码也要等待上面完成后继续执行;
5、执行 new Promise,输出promise1,然后将resolve放入微任务异步队列;
6、执行console.log(‘script end’),输出script end;
7、到此同步的代码就都执行完成了,然后去微任务异步队列里去获取任务
8、接下来执行resolve(async2返回的promise返回的),输出了async1 end。
9、然后执行resolve(new Promise的),输出了promise2。
10、最后执行setTimeout,输出了settimeout。

版权声明:本文为CSDN博主「yun_hou」的原创文章,遵循CC 4.0 BY-SA
原文链接:https://blog.csdn.net/yun_hou/article/details/88697954

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/6974.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot(01)项目搭建与启动

01,项目搭建与启动 一,项目搭建 有多种方式可以搭建Spring Boot项目,包括: 使用Spring Boot CLI命令行工具使用Spring Initializr网站或IDE插件生成项目模板使用Maven或Gradle手动配置项目 每种方式都有其优缺点,具…

Android IPC Binder机制学习(一)

一、多进程系统设计及意义Android系统分为5层,不过Android一般岗位只关注上三层就够用了即:应用层、framework层、native层。Android中的应用层和系统服务层不在同一个进程,系统服务在单独的进程中。Android中不同的应用属于不同的进程中Andr…

ChatGPT遭禁用、抵制后又停止Plus付费发生了?

ChatGPT相关信息 2023年2月27日消息,Snapchat 正在推出一个基于 OpenAI 的 ChatGPT 最新版本的聊天机器人。 这款名为“My AI”的机器人将被固定在应用界面的聊天选项卡上,虽然最初仅适用于每月3.99美元的SnapchatPlus付费订阅用户,但最终目…

图像分类综述

一、图像分类介绍 什么是图像分类,核心是从给定的分类集合中给图像分配一个标签的任务。实际上,这意味着我们的任务是分析一个输入图像并返回一个将图像分类的标签。标签来自预定义的可能类别集。 示例:我们假定一个可能的类别集categories …

Vue3+vite2 博客前端开发

Vue3vite2 博客前端开发 文章目录Vue3vite2 博客前端开发前言页面展示代码设计卡片设计背景(Particles.js粒子效果)右侧个人信息与公告内容页友链总结前言 大家是否也想拥有一个属于自己的博客?但是如何去开发博客,怎样去开发一个…

毫升 | 主成分分析(PCA)

这种方法是由Karl Pearson 介绍的。它的工作条件是,当高维空间中的数据映射到低维空间中的数据时,低维空间中数据的方差应最大。 主成分分析 (PCA) 是一种用于降低大型数据集维数的统计技术。它是机器学习、数据科学和其他处理大型数据集的领域中常用的…

如何通过C++ 将数据写入 Excel 工作表

直观的界面、出色的计算功能和图表工具,使Excel成为了最流行的个人计算机数据处理软件。在独立的数据包含的信息量太少,而过多的数据又难以理清头绪时,制作成表格是数据管理的最有效手段之一。这样不仅可以方便整理数据,还可以方便…

aspnet030高校学生团体管理系统sqlserver

net030高校学生团体管理系统 . 1.用户基本信息管理模块:录入、修改、删除、查询、统计、打印等功能 2.学生成绩管理模块:录入、修改、删除、查询、统计、打印等功能 3.学生团体信息管理模块:录入、修改、删除、查询、统计、打印等功能 4.教…

Excel技能之查找筛选排序,同事竖起大拇指

每天面对大量的数据,眼睛都看花了。头疼、脱发、颈椎病、胸闷、腰间盘突出,一系列并发症严重影响打工人的心情。同事看在眼里,痛在心里。 救救打工人吧!打工人的福音来了,自从学会了查找筛选排序,手脚利索…

动态规划(一) part1

T1:一个数组 中的最长 升序 子序列 的长度 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组…

C 非线性结构——树 万字详解(通俗易懂)

目录 一、树的介绍 1.定义 : 2.相关概念 : 3.简单分类 : 4.相关应用 : 二、树的存储 1.二叉树的存储 : 1 二叉树连续存储 2 二叉树链式存储(常用) 2.普通树和森林的存储 : 1 普通树的存储 2 森林的存储 三、树的遍历 1.二叉树先序遍历 : 2.二叉…

深度学习训练营之yolov5训练自己的数据集

深度学习训练营之训练自己的数据集原文链接环境介绍准备好数据集划分数据集运行voc_train.py遇到问题完整代码创建new_data.yaml文件模型训练时遇到的报错模型训练结果可视化参考链接原文链接 🍨 本文为🔗365天深度学习训练营 中的学习记录博客&#x1f…

正则表达式

一、正则表达式的概述 1、概念 正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操…

JVM 程序计数器(PC)

PC寄存器的概念 JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器&#…

【蓝桥杯冲刺】日期类专题特训

目录 1. 日期累加 题目描述 输入 输出 代码 2. 日期差值 题目描述 输入 输出 代码 3. 打印日期 题目描述 输入 输出 代码 写在最后: 1. 日期累加 题目链接:日期累加 题目描述 输入 1 2008 2 3 100 输出 2008-05-13 代码 #include…

如何在 Linux 中查找所有符号链接,这几个命令得会!

在Linux中,符号链接(Symbolic Link)是一种非常常见的文件类型,也称为软链接。符号链接是指向另一个文件的指针,而不是实际的数据。它允许用户创建一个指向另一个文件的虚拟文件,这样用户可以在不改变实际文…

JVM解析原理

目录1.JVM内存结构2.JIT及时编译器的原理,优化以及切换编译器类型2.1解释型语言和编译语言2.2JIT即时编译器(Just In Time Compiler)3.类的加载机制和类的加载器3.1类的加载机制3.2类的加载器4.双亲委派机制4.1定义4.2优点4.3总结5.虚拟机栈详…

读破万卷,神交古人,突破ChatGPT4096的Token限制,建立自己的垂直领域资料人工智能助理

ChatGPT的泛用性极高,上知天文,下通地理,参考古今,博稽中外,几乎无所不知,无所不晓。但如果涉及垂直领域的专业知识点,ChatGPT难免也会有语焉不详,闪烁其词的毛病,本次我…

16从零开始学Java之Java里的输入与输出语句有哪些?

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 我们在前面的文章中,学习了如何创建Java文件,也学习了Java里的标识符、运算符、进制等内容。有些…

iPhone手机小技巧:使用备忘录创建清单

手机备忘录是非常常用的软件之一,无论是iPhone手机还是安卓系统的手机都可以下载相应的APP进行使用。它可以帮助我们记录很多琐碎的事情,防止我们遗忘某事。 在记备忘录的时候,有的人是直接打字记录的,也没有什么具体的格式&…