jsp循环输出表格_「翻译」JS可视化学习之七:Promise、事件循环和异步2

喜欢排队吧,它能保护你的时间和精力 - 排队纪律维护员Event Loop

e3093915b4a228a1ab5ee081cea4d3ac.png

Promise和事件循环概览图

请注意上面这张图,Promise和事件循环的那些事,将在这个图上缓缓展开。


微任务和(宏)任务

好了,(经过上一节对Promise的理解)现在我们对如何创建Promise以及如何从Promise中获取值多了一些了解。让我们在script中添加更多的代码,然后再次运行它:

1c1f6905ffb7be6b3f2e58ff6e9e8c47.gif

等等,发生了什么?!

首先,输出了"Start!"。好吧,显而易见的:console.log('Start!') 就在第一行!但是,输出的第二个值是"End!"而不是Promise的值!只有在"End!"输出后,Promise的值才被输出。这是怎么回事?

我们终于见识到Promise的真正力量!虽然JavaScript是单线程的,但是我们可以使用Promise添加异步行为!


但是稍等一下,我们以前不是见过了吗?在JavaScript事件循环中(「翻译」JavaScript的可视化学习之一:事件循环),我们不也可以使用浏览器的本地方法(如setTimeout)来创建某种异步行为吗?

没错!但是,在事件循环中,实际上有两种类型的队列:(宏)任务队列(或简称为任务队列):(macro) task queue 微任务队列microtask queue(宏)任务队列用于(宏)任务微任务队列用于微任务

那么什么是(宏)任务,什么是微任务呢?下面表格罗列了一些最常用的!

(Macro)task:

setTimeout

setInterval

setImmediate

Microtask:

process.nextTick

Promise callback

queueMicrotask

啊,我们在微任务列表中看到了Promise!当Promise处理并调用其then()catch()finally()方法时,该方法内的回调将添加到微任务队列中!这意味着then()catch()finally()方法中的回调不会立即执行,这实际上是在我们的JavaScript代码中添加了一些异步行为!

那么then()catch()finally()回调函数在什么时候执行呢?事件循环为任务设定了不同的优先级:

1、当前在调用堆栈中的所有函数被执行,当它们返回一个值时,它们将从堆栈中弹出。

2、当调用堆栈为空时,所有排队的微任务将一个接一个的弹出到调用堆栈中,并执行!(微任务本身也可以返回新的微任务,实际创建了一个无限的微任务循环)

3、如果调用堆栈和微任务队列都为空,则事件循环将检查(宏)任务队列中是否还有任务。如果有,任务被弹出到调用堆栈,执行,然后弹出调用堆栈!


让我们看一个简单的例子,简单地使用:

Task1: 一个立即添加到调用堆栈中的函数,例如在代码中立即调用它。

Task2, Task3, Task4: 微任务,例如一个Promisethen回调,或使用queueMicrotask添加的任务。

Task5, Task6: (宏)任务,例如setTimeoutsetImmediate回调。

502467034d7248b0faa3f23effd77665.gif

首先,Task1返回一个值并从调用堆栈中弹出。然后,引擎检查微任务队列中排队的任务。一旦所有任务都被放入调用堆栈并最终弹出,引擎将检查(宏)任务队列中的任务,任务将弹出到调用堆栈中,并在它们返回值时弹出。

好吧,好吧,粉色盒子够多了。让我们用一些真正的代码来使用它!

console.log('Start!')setTimeout(() => {console.log('Timeout!')}, 0)Promise.resolve('Promise').then(res => console.log(res))console.log('End!')

在这段代码中,我们有宏任务setTimeout和微任务Promise then()回调。定位到setTimeout函数的行,让我们一步一步地运行这段代码,看看会输出了什么!

小提示 - 在下面的示例中,我展示了如下方法console.log,setTimeout和Promise.resolve,他们被添加到调用堆栈中。它们是内部方法,实际上不会出现在堆栈跟踪中 — 因此,如果您正在使用调试器并且在任何地方都看不到它们,请不要担心!这么做只是为了让解释这个概念更容易,而不需要添加一堆示例代码。

在第一行,引擎遇到console.log()方法。它被添加到调用堆栈中,然后输出"Start!"到控制台。方法从调用堆栈中弹出,引擎继续运行。

87bbd9eee0cd42fab2dade192c05fc08.gif

引擎遇到setTimeout方法,该方法被弹出到调用堆栈中。setTimeout方法是浏览器的本地方法:它的回调函数(() => console.log('In timeout')) 将被添加到Web API中,直到计时器完成。虽然我们为计时器提供了值 0,但是回调仍然会首先被推送到Web API,之后它会被添加到(宏)任务队列中:setTimeout是一个宏任务!

429269910083131c957fe7bb0d146c35.gif

引擎遇到Promise.resolve()方法。这个Promise.resolve()方法被添加到调用堆栈中,之后处理并返回"Promise!"。然后它的then回调函数被添加到微任务队列中。

a8b4e153309c759d9d094a61d94deabd.gif

引擎遇到console.log()方法。它会立即添加到调用堆栈中,然后输出"End!"到控制台,从调用堆栈中弹出,引擎继续运行。

8189f624264107c606d3bc2a36be56be.gif

引擎发现调用堆栈现在是空的。由于调用堆栈是空的,它将检查微任务队列中是否有排队的任务!是的,Promisethen回调正在等待!它被弹出到调用堆栈中,然后输出Promise的值:在这里是字符串"promise!"。

eedde66f540523679c0ef05e112173f2.gif

引擎发现调用堆栈是空的,因此它将再次检查微任务队列,以查看是否有排队的任务。不,微任务队列都是空的。

是时候检查(宏)任务队列了:setTimeout回调仍在那里等待!setTimeout回调被弹出到调用堆栈。回调函数返回console.log方法,该方法输出字符串“In timeout!”。setTimeout回调从调用堆栈中弹出。

1303b27d91454f7c816ef4a19b3c8818.gif

终于,一切都完成了!现在看来我们之前看到的输出结果并不是那么出乎意料。


翻译来源:https://dev.to/lydiahallie/javascript-visualized-promises-async-await-5gke

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

azure api 管理_具有Azure功能的无服务器API

azure api 管理在这篇文章中,我将研究一个非常简单的用例。 在执行部署管道时, FlexDeploy可能会产生一些应被批准或拒绝的人工任务。 例如,某人必须批准对生产环境的部署。 可以在FlexDeploy UI中或通过某些外部通信渠道来完成。 今天&#…

Maven插件目标

插件就是打成 jar 包的 Java 类,目标其实就是指方法,代表一种功能,也就是代表执行一种任务,你可以指定具体的任务,不过目标也有自己默认的任务。

android 渐变圆形进度条_flutter好用的轮子推荐七-flutter圆形或线型进度条

前言Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。IT界著名的尼古拉斯高尔包曾说:轮子是IT进步的阶梯!热门的框架千篇一律,好用轮子万里挑一!Flutter作为这两年开始崛起的跨平台开发…

jakarta ee_Jakarta EE中的规范范围

jakarta ee使用Eclipse Foundation Specification Process (EFSP),一个开放源代码规范项目就有一个专门的提交者项目团队来创建和维护一个或多个规范。 创建和维护的周期跨越了该规范的多个版本,因此尽管各个成员可能来去去去&…

苹果雪豹操作系统正式版_Android 11 正式版发布!

整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)头图 | CSDN 下载自谷歌官网Android 11今天正式发布了!新版本主要加强了聊天气泡、安全隐私、电源菜单,以及对瀑布屏、折叠屏、双屏的支持。除了谷歌自家的Pixel 手机,一加、小米、OPPO、Realme的手机用…

Maven的单元测试没有执行的问题

今天使用 Maven 的单元测试,正常导入以下的类 org.junit.Assert; org.junit.After; org.junit.Before; org.junit.Test;在项目的根目录下执行 mvn test,结果并没有执行单元测试,也是无语了。普通的 Java 项目可以正常运行,但是 M…

lambda表达式优化反射_反射选择器表达式

lambda表达式优化反射Java :: Geci是一个在单元测试期间运行的代码生成器。 如果生成的代码适合源代码的实际版本,则测试不会失败。 如果需要进行任何修改,则测试将修改源代码并失败。 例如,存在一个需要setter和getter的新字段,然…

10个常用python标准库_【循序渐进学Python】11.常用标准库

安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间。这里是一些常用标准库的简单说明。更多的标准库的说明,可以参考Python文档 sys 模块 sys模块能够访问与Python解释器紧密联系的变量和函数…

Sublime Text安装格式化xml的插件

参见:https://www.cnblogs.com/sxdcgaq8080/p/7682593.html

maven原型_创建自定义Maven原型

maven原型Maven原型是项目模板,可以帮助我们根据其类型快速创建maven入门项目 。 这是一个不费吹灰之力地引导Maven项目的好工具。 我们可以使用多种原型。 一些流行的原型包括– maven-archetype-quickstart , maven-archetype-webapp , ma…

Maven的单元测试插件maven-surefire-plugin详解

文章目录pom.xml 的配置(注意事项,非常重要)测试案例执行测试命令surefire 插件配置pom.xml 的配置(注意事项,非常重要) 1.必须引入 maven-surefire-plugin 插件,否则无法使用 Maven 的测试功能…

mysql启动命令 windows_Windows下Nginx的启动停止等基本操作命令详解

在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动、停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍。1、启动:C:serverginx-1.0.2>start nginx或C:serverginx-1.0.2>ngin…

警告提示:No archetype found in remote catalog. Archetype not found in any catalog

IDEA 使用 archetype(原型/模板/骨架)创建 Maven 项目时, 最后提示: No archetype found in remote catalog. Defaulting to internal catalog Archetype not found in any catalog. Falling back to central repository. Add a…

python存数据到excel_python爬取的数据--保存数据到excel

在这里用到的是xlwt import xlwt 如果还未安装此模块,可以执行下面的命令安装: pip install xlwt 接下来就是将数据列表存储到excel当中: def save_to_excel(): try: workbook xlwt.Workbook(encodingutf-8) sheet workbook.add_sheet(taob…

vm 安装jdk1.8_JDK 13:VM.events已添加到jcmd

vm 安装jdk1.8CSR( 兼容性和规范审查 ) JDK-8224601 [“提供VM.events诊断命令”]从JDK 13 Early Access Build #24 (日期为2019/6/6 )开始在JDK 13中实现,并通过增强功能JDK- 8224600 [“提供VM.events命令…

macos big sur正式版_苹果macOS Big Sur正式版发布

苹果macOS Big Sur正式版发布:支持M1原生运行iOS应用苹果macOS Big Sur正式发布并开放下载,版本号为macOS 11.0.1(20B29)苹果近期刚发布了搭载M1芯片的Mac mini、MacBook Air和MacBook Pro新机型,预装了全新的macOS Big Sur苹果表示&#xff…

Maven如何生成可执行的jar文件

参考1:https://juejin.cn/post/6844903622430425095 参考2:http://xxgblog.com/2015/08/07/maven-create-executable-jar/ 参考3:https://www.cnblogs.com/justinzhang/p/4975727.html 参考4:https://www.cnblogs.com/hafiz/p/653…

java中qrcode_如何在Java中使用QRGen创建QRCode

java中qrcode在我以前的一篇文章中 ,我们了解了如何使用Zxing Java库创建QRCode及其等效的SVG。 Zxing库不再得到积极维护,为此,Zxing库周围有一个名为QRGen的包装,该包装提供了更高级别的API和用于生成QR代码的构建器语法。 在本…

java list有序还是无序_最详细的Java学习点知识脑图,从基础到进阶,看完还有啥你不懂的...

欢迎关注专栏《Java架构筑基》——专注于Java技术的研究与分享!Java架构筑基​zhuanlan.zhihu.comJava架构筑基——专注于Java技术的研究与分享!后续文章将首发此专栏!欢迎各位Java工程师朋友投稿和关注# 链接 Java程序员福利"常用资料分…