深入promise

news2024/11/26 4:41:14

深入promise

我们可能知道如何使用 Promise,但是我们知道它们实际上是如何工作的吗?

为了让每个人都了解Promise,让我们从基础开始。如果我们知道 Promise 是什么以及如何使用它,我们可以跳过这一部分并直接跳到“魔法开始”的地方。

什么是Promise

当有人向我们询问一些我们现在没有的数据时,我们可以Promise稍后发送或在出现问题时发送错误。

因此Promise是一个代表异步操作最终完成或失败的对象。

如何创建 Promise

使用Promise 构造函数。

let promise = new Promise(function(resolve, reject) {
  // 当Promise初始化后会自动执行这个方法

  // 1s后返回done
  setTimeout(() => resolve("done"), 1000);
});

传递给构造函数的函数称为“执行器”函数。它包含最终应产生结果的代码。创建new Promise 时,执行器会自动运行。

传递给执行器的resolve reject参数是 JavaScript 提供的函数。当我们准备好提供Promise结果时,请调用resolve ;如果出现问题,请调用reject

Promise 构造函数创建的promise对象具有以下属性:

  • state — 最初为 pending ,然后在调用resolve时更改为 fulfilled ,或者在调用reject时更改为 rejected
  • result — 最初为undefined,然后在调用resolve(value)时更改为value ,或者在调用reject(error)时更改为error

在这里插入图片描述

如何从Promise中获取实际数据?

我们可以使用then函数订阅承诺中的数据。

promise.then(
  function(result) { /* 处理成功的数据 */ },
  function(error) { /* 处理异常的数据 */ }
);

then的第一个参数是一个在 Promise 得到解决并接收结果时运行的函数。

then的第二个参数是一个在 Promise 被拒绝并收到错误时运行的函数。

then方法返回一个 Promise,这就是 Promise 可以被链式调用的原因:

promise.then(
  function(result) {  return someValue; },
).then(
  function(result2) { /* result2的值是someValue */ }
)

Promise 静态方法

Promise 对象有以下静态方法:

  • Promise.all(iterable) — 等待所有 Promise 得到解决,或者任何 Promise 被拒绝。
  • Promise.allSettled(iterable) — 等待所有 Promise 都已被处理(每个 Promise 都可以解决或拒绝)。
  • Promise.any(iterable) — 接受多个 Promise 对象,并且一旦对象中的一个Promise满足,就返回一个用该Promise的值解析。
  • Promise.race() — 等待任何Promise被解决或拒绝。
  • Promise.reject(reason) — 返回一个新的 Promise 对象,该对象因给定原因而被拒绝。
  • Promise.resolve() — 返回一个用给定值解析的 Promise 对象。如果该值是一个 Promisethenable对象,则返回该 Promise;否则,返回的promise将用该值来作为返回。

深入研究

我们将更深入地研究 Promise 的状态如何以及何时从“待处理”更改为“已完成”。

让我们创建一个简单的 Promise 对象,它立即解析一个普通值:

let promise = new Promise(function(resolve, reject) {
   resolve(5);
});
console.log(promise);

我们期望看到哪种状态?

没错,这是一个已解决的promise,值为 5。

现在,请记住Promise.resolve()用法示例:

Promise.resolve(Promise.resolve(5)) -> returnspromise<fulfilled>(5)

看看以下代码:


let promise = new Promise(function(resolve, reject) {
   resolve(Promise.resolve(5));
});

console.log(promise);

我们希望再次看到Promise.resolve()已解决,对吧?

但是这个打印的promise将处于“待处理”状态。

现在考虑我们输出与上面示例相同的promise,但有延迟:

setTimeout(() => console.log(promise), 0);

此时的Promise 现在处于已解决。

让我们总结一下我们的实验结果:

  • Promise.resolve返回一个已解决的普通值的promise
  • 当传递的值是已解决的promise时, Promise.resolve返回已解决的promise
  • 传递给执行器的 resolve 函数返回一个已解决的promise
  • 当传递的值是已解决的 Promise 时,传递给执行器的 resolve 函数会返回一个挂起的 Promise
  • 当传递的值是已解决的Promise时,传递给执行器的解析函数的延迟结果是已解决的Promise

在这里插入图片描述

结论

显然Promise.resolve()resolve()的工作方式不同。

  • Promise.resolveresolve函数对于普通值的工作方式相同。两歌都返回了最终值。
  • Promise 作为参数传递时,Promise.resolveresolve函数的工作方式不同。当resolve以某种奇怪的方式工作时, Promise.resolve返回作为参数传递的相同的promise
  • resolve返回待处理Promise(不管这个Promise的状态如何),并且可能以某种异步方式更改返回的Promise状态。

这是否意味着当 Promise 作为参数传递时,resolve函数会异步工作?

为了理解这一点,让我们看一下 Promise 中肯定是异步工作的部分—— thencatchfinally函数。

我们可能听说过Promise 函数使用的是微任务队列。如果没有,让我们快速提醒一下。

当新的函数订阅 Promise 时,JavaScript 会将其放入微任务队列中。当 Promise 准备好(完成或拒绝)并且引擎不再处理同步代码时,JavaScript 会从微任务队列中逐一获取并调用回调。队列按照 FIFO 规则工作——“先进先出”。一般来说,微任务队列就像一个用于超时等的事件循环,但它具有更高的优先级。

在这里插入图片描述

resolve函数采用纯值作为参数时,它会立即执行。但是,如果参数是一个Promise(无论 Promise 的状态是什么),它就会订阅它,并将该函数放入微任务队列中 - 直到 Promise 准备好并且引擎可以自由地执行函数。这就是为什么我们不会立即得到一个已解决的Promise,而是在setTimeout中得到它。

规范中描述了此行为,感兴趣的可以去看看。

在本文中,我们试图揭示使用 Promise 的细微差别,并清楚地展示我们可能遇到的问题。

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

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

相关文章

Halcon中涉及的数字图像十大理论知识

1.图像处理知识 2.图像的灰度变换 3.图像增强 4.图像的几何变换 5.图像分割 6.图像的频域 7.图像的形态学 8.图像的复原 9.运动图像 10.图像配准

uni-app--》基于小程序开发的电商平台项目实战(五)

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

Spring实战 | Spring AOP核心功能分析之葵花宝典

国庆中秋特辑系列文章&#xff1a; 国庆中秋特辑&#xff08;八&#xff09;Spring Boot项目如何使用JPA 国庆中秋特辑&#xff08;七&#xff09;Java软件工程师常见20道编程面试题 国庆中秋特辑&#xff08;六&#xff09;大学生常见30道宝藏编程面试题 国庆中秋特辑&…

实验3:左右循环LED灯

获取流水灯工程&#xff1a; 方式一&#xff1a; keilproteus 完成最小系统&#xff0c;点亮led 灯实验_吴小凹的博客-CSDN博客 方式二&#xff1a; Flowing_led.zip - 蓝奏云直接下载。 原理图修改&#xff1a; 无须修改只需要使用流水灯的工程即可&#xff0c;解压到桌面…

机器人命令表设计

演算命令 CLEAR 将数据 1 上被指定的编号以后的变数的内容&#xff0c;以及数据 2 上仅被指定的个数都清除至 0。 INC 在被指定的变数内容上加上 1。 DEC 在被指定的变数内容上减掉 1。 SET 在数据 1 上设定数据 2。 ADD 将数据 1 和数据 2 相加&#xff0c;得出的结果保存在数…

小华HC32F448串口使用

目录 1. 串口GPIO配置 2. 串口波特率配置 3. 串口接收超时配置 4. 串口中断注册 5. 串口初始化 6. 串口数据接收处理 7. DMA接收配置和处理 1. 串口GPIO配置 端口号和Pin脚号跟STM32没什么区别。 串口复用功能跟STM32大不一样。 如下图&#xff0c;选自HC32F448 表 2…

AI 律助 Alpha GPT 线上实操发布会,重磅发布!

数字化时代,随着人工智能的迅猛发展,各行各业都在积极探索通过智能化工具实现工作效率翻升的可能性。“ ChatGPT 类产品”是未来办公应用软件发展的重要趋势之一,但如何将 ChatGPT 真正应用于法律人的工作,赋能效率提升?法律行业同样面临着新的挑战和机遇。 破局的关键是实现技…

mysql面试题50:500台数据库,如何在最快时间之内重启

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:500台db,如何在最快时间之内重启呢? 如果需要在最快时间内重启500台数据库,可以考虑采用并行化和自动化的方法来提高效率。比如: 编写自动化脚…

ubuntu中查看进程并结束进程以查看资源占用命令

ps命令&#xff1a;可以列出正在运行的进程。ps -e ps -aux 查看所有进程&#xff0c;每行一个程序&#xff08;常用&#xff09;ps -A 查看当前系统所有的进程。&#xff08;常用&#xff09;ps -A | grep chrome 命令去搜索某个指定进程。&#xff08;常用&#xff09;ps -A…

SQL sever中的索引

目录 一、索引定义 二、索引结构 2.1. B-树索引结构&#xff1a; 2.2. 哈希索引结构&#xff1a; 三、索引作用 四、索引与约束区别 五、索引级别 六、索引分类 6.1. 聚集索引&#xff08;Clustered Index&#xff09;&#xff1a; 6.2. 非聚集索引&#xff08;Noncl…

2023年中国石油测井设备市场格局及存在问题分析[图]

油气勘探就是利用各种勘探手段寻找和查明油气资源、确定油气聚集有利地区、找到储油气的圈闭、探明油气田面积和油气层情况并预测产出能力的过程&#xff1b;油气开发是在油田最终投产前的必要环节。 随着石油测井行业的不断发展&#xff0c;使用测井仪器的测井服务单位对仪器无…

华为云云耀云服务器L实例评测|华为云耀云服务器L实例docker部署及应用(七)

八、华为云耀云服务器L实例docker、docker-compose安装及部署MySQL、Redis应用&#xff1a; 随着云原生、容器化、微服务、K8S等技术的发展&#xff0c;容器 docker 也逐渐在企业团队实践中大量的使用。它可以提供了一套标准化的解决方案&#xff0c;极大地提升了部署、发布、运…

生成Android证书

前提&#xff1a;确保本机安装好了java1.8 第一步 打开CMD keytool -genkey -alias AAAA -keyalg RSA -keysize 2048 -validity 36500 -keystore D:\mygitee\keyStore\szxApp.jksD:\mygitee\keyStore\szxApp.jks是证书要生成的位置 szxApp.jks 是证书名称 D:\mygitee\keySto…

八大排序算法(含时间复杂度、空间复杂度、算法稳定性)

文章目录 八大排序算法(含时间复杂度、空间复杂度、算法稳定性)1、&#xff08;直接&#xff09;插入排序1.1、算法思想1.2、排序过程图解1.3、排序代码 2、希尔排序3、冒泡排序3.1、算法思想3.2、排序过程图解3.3、排序代码 4、&#xff08;简单&#xff09;选择排序4.1、算法…

Web应用防火墙的性能优化技术

Web应用防火墙&#xff08;WAF&#xff09;是企业网络安全的重要屏障&#xff0c;其性能直接影响到网络服务的质量和安全。本文详细探讨了WAF性能优化的几种技术&#xff0c;旨在为网络安全专业人员提供实用的参考。 规则优化 1.1 精简规则集 规则评估&#xff1a;定期评估规…

深入了解Spring Boot Actuator

文章目录 引言什么是ActuatorActuator的底层技术和原理端点自动配置端点请求处理端点数据提供端点数据暴露 如何使用Actuator添加依赖访问端点自定义端点 实例演示结论 引言 Spring Boot Actuator是一个非常强大且广泛使用的模块&#xff0c;它为Spring Boot应用程序提供了一套…

数据库:Hive转Presto(五)

此篇将所有代码都补充完了&#xff0c;之前发现有的代码写错了&#xff0c;以这篇为准&#xff0c;以下为完整代码&#xff0c;如果发现我有什么考虑不周的地方&#xff0c;可以评论提建议&#xff0c;感谢。代码是想哪写哪&#xff0c;可能比较繁琐&#xff0c;还需要优化。 …

Kafka SASL认证授权(五)ACL源码解析

Kafka SASL认证授权(五)ACL源码解析。 官网地址:https://kafka.apache.org/ 一、ACL检查流程解析 一起看一下kafka server的启动与监听流程: Kafka -> KafkaServer -> SocketServer、KafkaRequestHandler 其中KafkaServer做相关的初始化,包括SocketServer 与 han…

实体解析实施的复杂性

实体的艺术表现斯特凡伯克纳 一、说明 实体解析是确定数据集中的两条或多条记录是否引用同一现实世界实体&#xff08;通常是个人或公司&#xff09;的过程。乍一看&#xff0c;实体分辨率可能看起来像一个相对简单的任务&#xff1a;例如&#xff0c;给定一张人物的两张照片&a…

AOMEI PXE Boot Free

两台电脑网线直连&#xff0c;不用设置固定IP&#xff0c;该软件包含DHCP。 名称: 3H3AOMEIPXEBootFree.rar 大小: 13068734 字节 (12 MiB) SHA1: 1e606c8c1ee3badf8af9a87f61fdf2e332b773e6 名称: PXEBoot.exe 大小: 13124928 字节 (12 MiB) SHA1: 95286ac18e9b81c2a68412c40…