Promise.reslove().then中return值对.then执行顺序的影响

return的类型

Promise.reslove().then(){}中的返回值的三种情况:

  1. 基本数据类型
  2. 带then方法的对象
  3. Promise.reslove(4)
    Promise.reslove().then(){return 4;return {then: function (reslove){reslove(4)}}return Promise.reslove(4)}

首先看以下代码的输出:

Promise.resolve().then((res) => {console.log(0);return 4}).then((res)=>{console.log(res);})
Promise.resolve().then(()=>{console.log(1);}).then(()=>{console.log(2);}).then(()=>{console.log(3);}).then(()=>{console.log(5);}).then(()=>{console.log(6);})// 0142356

接下来修改return的内容:

        // 修改为return {then: function (resolve) {resolve(4)}
// 0124356

接下来再修改return的内容:

        // 修改为return Promise.reslove(4)
// 0123456

为什么不同的return 值会产生不同的执行顺序?

首先,我们要明确一点:微任务的执行顺序是根据它们的注册顺序执行的

其次:.then(){}中的 return 其实是一个Promise.reslove()包装后的值

为了方便描述,我们将第一个Promise.reslove()称为P1,第二个Promise.reslove()称为P2。

在第一种情况:return 4

执行顺序为:

-  执行 P1.then(0)完毕,返回一个Promise.reslove(4),注册 P1.then(0){}.then(4)
-  执行 P2.then(1),注册 P2.then(1){}.then(2)
-  执行 P1.then(0){}.then(4),不再有新的then注册
-  执行 P2.then(1){}.then(2),注册 P2.then(1){}.then(2){}.then(3)
-  P2继续执行
-  输出为:0、1、4、2、3、5、6

第二种情况

执行顺序为:

-  执行 P1.then(0),返回一个Promise.reslove({then: function(reslove){reslove(4)}})
-  执行 P2.then(1),注册 P2.then(1){}.then(2)
-  执行 Promise.reslove.then(reslove),注册 P1.then(0){}.then(4)
-  执行 P2.then(1){}.then(2),注册 P2.then(1){}.then(2){}.then(3)
-  执行 P1.then(0){}.then(4),不再有新的then注册
-  执行 P2.then(1){}.then(2){}.then(3),注册 P2.then(1){}.then(2){}.then(3){}.then(4)
-  P2继续执行
-  输出为:0、1、2、4、3、5、6

第三种情况

执行顺序为:

-  执行 P1.then(0),返回一个 Promise.reslove(Promise.reslove(4))-  执行 P2.then(1),注册 P2.then(1){}.then(2)-  执行 Promise.reslove(Promise.reslove(4)),返回一个Promise.reslove(4)。内层的 Promise.reslove(4)没有.then注册-  执行 P2.then(1){}.then(2),注册 P2.then(1){}.then(2){}.then(3)-  执行 Promise.reslove(4),注册外层的 P1.then(0){}.then(4)-  执行 P2.then(1){}.then(2){}.then(3),注册 P2.then(1){}.then(2){}.then(3){}.then(4)-  执行 P1.then(0){}.then(4),不再有新的then注册-  执行 P2.then(1){}.then(2){}.then(3){}.then(4),注册 P2.then(1){}.then(2){}.then(3){}.then(4){}.then(5)-  执行 P2.then(1){}.then(2){}.then(3){}.then(4){}.then(5),注册 P2.then(1){}.then(2){}.then(3){}.then(4){}.then(5){}.then(6)-  执行 P2.then(1){}.then(2){}.then(3){}.then(4){}.then(5){}.then(6),没有新的.then 注册-  输出为:0、1、2、3、4、5、6

所以让咱们来一次套娃:


Promise.resolve().then((res) => {console.log(0);return Promise.resolve().then(() => {return {then: function (resolve) {resolve(Promise.resolve(4))}}})}).then((res) => {console.log(res);})
Promise.resolve().then((res) => {console.log(1);}).then((res) => {console.log(2);}).then((res) => {console.log(3);}).then(() => {console.log(5);}).then(() => {console.log(6);}).then(() => {console.log(7);}).then(() => {console.log(8);})

输出是 0、1、2、3、5、6、7、4、8

总结:return的值中,1. 基础数据类型则在此次执行中注册下一个then。 2. { then : function(reslove){} }则在此次执行后的下一次再注册下一个then。 3. Promise.reslove(基础数据类型) 则加多一次,下两次才注册

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

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

相关文章

【C++】二叉搜索树

二叉搜索树 前言正式开始模拟实现树节点以及树框架增中序遍历查找删除 递归实现增删查查插删 析构拷贝构造赋值重载时间复杂度分析应用场景两道题 前言 本来想先把搁置了一个月的Linux讲讲的,但是里面有些内容需要用到一些比较高级的数据结构,用C写的话…

【业务功能篇61】SpringBoot项目流水线 dependencyManagement 标签整改依赖包版本漏洞问题

业务场景:当前我们项目引入了公司自研的一些公共框架组件,比如SSO单点登录jar包,文件上传服务jar包等公共组件,开发新功能,本地验证好之后,部署流水线,报出一些jar包版本的整改漏洞问题&#xf…

rust usize与i64怎么比较大小?

在Rust中, usize 和 i64 是不同的整数类型,它们的位数和表示范围可能不同。因此,直接比较 usize 和 i64 是不允许的。如果需要比较它们的大小,可以将它们转换为相同的类型,然后进行比较。 要将 usize 转换为 i64 &…

MongoDB 操作命令

创建database 有就切换没有创建 useMydatabase 显示数据库:show dbs显示该database下的 bson对象 show collections 显示该bson下的具体内容**mydatabase.mycollection.find()**查询该bson对象内容**且查询****mydatabase.mycollection.find({a:,b:})****或查询****…

二叉树OJ(C)

文章目录 1.单值二叉树1.1法一:无返回值1.2法二:有返回值 2.相同的树3.对称二叉树4.二叉树的前序遍历5.二叉树的中序遍历6.二叉树的后序遍历7.另一棵树的子树8.二叉树遍历 1.单值二叉树 1.1法一:无返回值 struct TreeNode {int val;struct …

Virtualbox虚拟机中Ubuntu忘记密码

1、首先重新启动Ubuntu系统,鼠标快速点一下Virtualbox虚拟机窗口获取焦点,然后按住shift键,以调出grub启动菜单。 2、根据提示按下键盘E键进入编辑模式,向下移动光标,将如下"ro quiet splash $vt_handoff"部…

SpringBoot集成jasypt,加密yml配置文件

SpringBoot集成jasypt,加密yml配置文件 一、pom配置二、生成密文代码三、配置3.1、yml加密配置3.2、密文配置3.3、启动配置3.4、部署配置 四、遇到的一些坑 最新项目安全检测,发现配置文件中数据库密码,redis密码仍处理明文状态 一、pom配置…

一套AI+医疗模式的医院智慧导诊系统源码:springboot+redis+mybatis plus+mysql

一套AI医疗模式的医院智慧导诊系统源码 相关技术: 技术架构:springbootredismybatis plusmysqlRocketMQ 开发语言:java 开发工具:IDEA 前端框架:Uniapp 后端框架:springboot 数 据 库:mys…

【win11+vs 2017+OpenCV4.5.5+Qt5.12配置】解决了过程中遇到的小问题

0.版本选择 由于Qt5无法与最新的vs2022兼容,扩展工具中一直显示不可用,所以将vs降级成vs2017。 在安装Qt的过程中,会选择安装Qt套件,其中就的MCVS 2017,说明vs2017是与qt兼容的。 当然也可以用qt creator这一原生IDE。…

LEARNING TO EXPLORE USING ACTIVE NEURAL SLAM 论文阅读

论文信息 题目:LEARNING TO EXPLORE USING ACTIVE NEURAL SLAM 作者:Devendra Singh Chaplot, Dhiraj Gandhi 项目地址:https://devendrachaplot.github.io/projects/Neural-SLAM 代码地址:https://github.com/devendrachaplot/N…

[软件工程] 全局分析规格说明书模板

1 价值需求 描述目标系统的价值需求,可以附上商业模式画布。 1.1 利益相关者 描述目标系统的利益相关者,包括终端用户、企业组织、投资人等。 1.2 系统愿景 描述利益相关者共同达成一致的愿景,该愿景的描述需要对准企业的战略目标。 1.3 系统…

机器学习分布式框架ray运行pytorch实例

Ray是一个用于分布式计算的开源框架,它可以有效地实现并行化和分布式训练。下面是使用Ray来实现PyTorch的训练的概括性描述: 安装Ray:首先,需要在计算机上安装Ray。你可以通过pip或conda来安装Ray库。 准备数据:在使用…

ES6基础知识九:你是怎么理解ES6中Module的?使用场景?

一、介绍 模块,(Module),是能够单独命名并独立地完成一定功能的程序语句的集合(即程序代码和数据结构的集合体)。 两个基本的特征:外部特征和内部特征 外部特征是指模块跟外部环境联系的接口…

Stable Diffusion AI绘画学习指南【插件安装设置】

插件安装的方式 可用列表方式安装,点开Extensions 选项卡,找到如下图,找到Available选项卡,点load from加载可用插件,在可用插件列表中找到要装的插件按install 按扭按装,安装完后(Apply and restart UI)应…

15、两个Runner初始化器和 springboot创建非web应用

两个Runner初始化器 两个Runner初始化器——主要作用是对component组件来执行初始化 这里的Component组件我理解为是被Component注解修饰的类 Component //用这个注解修饰的类,意味着这个类是spring容器中的一个组件,springboot应用会自动加载该组件。 …

【原创】IPTVC2实现方案(文末有demo)

前言: 名词解释: IPTVC2, 全称: 央视国际节目定价发布接口规范,标准版本当前最新为2.7.12 附赠资源链接,侵删:规范 规范中提供的样例,实现基于axis1.4(2006的时代宠物) 基于axis1版本的实现参考: Spring boot 集成Axis1.4 ,使用wsdd文件发…

【CSDN】

欢迎使用Mark编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#xff0c…

自动驾驶感知系统-全球卫星定位系统

卫星定位系统 车辆定位是让无人驾驶汽车获取自身确切位置的技术,在自动驾驶技术中定位担负着相当重要的职责。车辆自身定位信息获取的方式多样,涉及多种传感器类型与相关技术。自动驾驶汽车能够持续安全可靠运行的一个关键前提是车辆的定位系统必须实时…

【数学建模】——拟合算法

【数学建模】——拟合算法 拟合算法定义:与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数(曲线),使得该曲线在某种准则下与所有的数据点最为接近,即曲线拟合的最好&…

好用的Linux远程工具

你好,我是Martin,今天给大家介绍几款主流的远程工具。 远程工具介绍 关于远程连接的用户分类时这样的,通常需要进行远程连接的人有两类,一类是系统管理员,另一类是普通的用户。远程连接工具是一些可以让你通过网络连接…