Promise完全体总结

        我们在上篇文章提到了异步会导致无法通过返回值来获取函数的执行结果,我们通过传入一个回调函数的方式,以参数的形式获取到了我们想要获取的数据,但是这样如果需要对数据进行多次操作导致形成回调地狱那种不便于阅读以及护理的代码。

        为了解决这个问题Promise(承诺)作为一个存储数据的容器,帮助我们解决需要用回调函数的参数获取异步函数执行结果的问题,拥有着一套特殊的存储数据的方式。

1.Promise的介绍

          首先就是创建Promise,我们要认识到Promise是一个构造函数,模拟类,通过new去实例化,Promise是内建的构造函数,本质上就是类,用new得到实例(承诺对象)

        Promise构造函数需要一个函数作为参数,Promise构造函数的回调函数会在创建Promiss时调用,同时会有两个参数传递进去,resolve和reject两个函数,通过这两个函数可以向Promise存储数据,resolve在执行正常的时候存储数据 reject在执行错误的时候存储数据。

        当我们想要从Promise中读取数据的时候,要通过Promise实例方法then去读取Promise中存储的数据,then需要两个回调函数作为参数,resolve存储的数据会在第一个函数中作为参数返回,reject存储的数据或者丢出的错误会在第二个函数作为参数返回。

        代码如下。

        

         

         

         

 

        Promise还隐藏了两个隐藏属性 PromiseReault存储数据还有PromiseState记录Promise的状态(三种状态 fulfilled(完成) rejected(出错拒绝) pending(正在进行中)),state只能修改一次,修改以后永远不会更改,state是私有的 reject和reslove只能运行一个。

        Promise的运行流程---

        当Promise创建的时候,PromiseState初始值是pending,当resolve存储数据时,PromiseState变为fulfilled PromiseResult存储数据。

        当reject存储数据时,PromiseState变为rejected PromiseResult存储数据或者异常对象。

        当我们通过then读取数据的时候,相当于为Promise设置了回调函数,如果PromiseState变为fulfilled则调用then第一个回调函数返回数据 如果是reject则调用第二个回调函数返回数据。

        catch和then类似,catch()相当于then(null,(reason)=>{})专门处理异常的方法

        finally()也是传一个回调函数,无论正常存储数据还是出现异常都会执行。一般用来编写无论成功与否都需要执行的代码逻辑。

        

 2.Promise的详情 

        我们现在会使用Promise之后,搞一下原理.Promise就是一个存储数据的对象,但是存储方式特殊,所以可以直接将异步调用的结果存储到Promise中。 

const Promise = new Promise((resolve,reject)=>{})

        这句代码中Promise里面的函数是我们传进去的,resolve和reject是作为参数给我们返回的。所以我们定义这个函数就是为了让Promise把resolbe和reject这两个函数传过来。然后resolve和reject存储数据。

        我们现在回归正题,用promise去解决我们的回调地狱问题。

function sum(a,b,cb){setTimeout(()=>{cb(a+b)},1000)
}
const result=sum(1,1,(result)=>{sum(result,1,(result)=>{sum(result,1,(result)=>{sum(result,1,(result)=>{console.log(result);})})})
})

      这是我们最开始没有Promise的回调地狱。

       我们现在希望通过Promise去改进代码。但是这时候我们发现我们好像欠缺了点东西。我们虽然存储数据了但是我们想要实现多次调用还是需要一直调用

        

        这好像也是回调函数。

        现在添加一个新知识点。Promise中的then和catch方法的返回值都会存储到新的Promise中。这样我们就知道如何去避免回调地狱了。

function sum1(a,b){return new Promise((resolve,reject)=>{setTimeout(()=>{resolve(a+b)},1000)})
}
const p1 =sum1(1,1).then((result)=>{return '楚河日当午'
})
const p3 = p1.then((result)=>{console.log(result);return 'gogogo'
})
p3.then((result)=>{console.log(result);
})
setTimeout(()=>{console.log('p1',p1)
},1000)//

        我们可以第一个then返回一些数据然后赋值给一个变量,我们记得返回的是一个new Promise

然后PromiseResult就是我们的返回值,我们就可以再次通过then去获取最新的值,就可以实现每次then都可以获取到最新的值。

         

这样就解决了我们的回调地狱这个问题,现在我们来看我们的catch方法。

         

        我们发现在我们对Promise实例进行链式调用的时候,后面的方法thencatch读取上一步的执行结果如果上一步的执行结果不是我们当前想要的,就会跳过当前的方法。

        还有如果我们丢出错误没有用catch捕获就会报错。(Promise调用链没有catch却扔出错误)

         

 

        Promise是甩锅对象,如果catch出错了会直接抛出错误,需要用catch捕获。通常情况下catch写最后面就不用这样连续用了。相当于保安

        

         

        这里是一些扩展的方法以及使用方式。不常用。

        这就是Promise的使用了,当然想要深度理解还需要去分清楚异步的执行顺序宏任务和微任务,以及手写Promise。如果仅仅是知道怎么去用,这就已经足够了

         

 

        

         

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

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

相关文章

SpringJDBC源码初探-DataSource类

一、DataSource接口核心作用 DataSource是JDBC规范的核心接口,位于javax.sql包中,用于替代传统的DriverManager获取数据库连接。Spring框架通过org.springframework.jdbc.datasource包对该接口进行了增强,提供连接池管理、事务绑定等高级特性…

C语言(08)——关于指针(逐渐清晰版)

为了更好地理解本篇文章的知识内容,读者可以将以下文章作为补充知识进行阅读 : C语言————原码 补码 反码 (超绝详细解释)-CSDN博客 C语言————二、八、十、十六进制的相互转换-CSDN博客 C语言————斐波那契数列的理解…

LeetCode 1616.分割两个字符串得到回文串

给你两个字符串 a 和 b ,它们长度相同。请你选择一个下标,将两个字符串都在 相同的下标 分割开。由 a 可以得到两个字符串: aprefix 和 asuffix ,满足 a aprefix asuffix ,同理,由 b 可以得到两个字符串 …

算法【1】

网址:主站 工具补充 1. sort 函数的使用规则 作用:对容器元素进行排序,默认升序。语法:sort(起始迭代器, 结束迭代器, 比较规则) 前两个参数是排序范围:[begin, end)(包含begin,不包含end&am…

信创国产Linux操作系统汇总:从桌面到服务器,百花齐放

在数字化浪潮席卷全球的今天,操作系统作为信息产业的基石,其战略地位日益凸显。曾经由国外巨头垄断的格局正悄然改变——中国本土Linux操作系统历经多年沉淀,已形成了百花齐放的局面。无论是日常办公、专业开发,还是关键行业应用&…

claudia for claude code

一.安装所有必需的依赖项 1.安装 Git for Windows 步骤: 访问 Git 的官方网站 git-scm.com。 下载适用于 Windows 的最新版本安装程序。 运行安装程序。在安装向导的各个步骤中,建议保留所有默认设置,这些设置对于本指南的后续操作已经足够。 验证…

企业内外网文件安全传输解决方案

企业内外网文件安全传输解决方案 基于零信任架构的智能中转系统设计 一、业务背景与挑战分析 1.1 企业网络安全现状 在数字化转型浪潮下,企业面临着前所未有的安全挑战。传统的"城墙式"网络防护已无法满足现代企业灵活协作的需求。根据《2024年中国企业…

《HCIA-Datacom 认证》希赛三色笔记:详解 VLAN 间通信的 3 种实现方式

标记说明:■掌握内容 ■次重点 ■理解内容 在局域网部署中,VLAN 技术通过隔离广播域提升了网络安全性和稳定性,但不同 VLAN 间的通信需求又成了新的难题。比如财务部门的电脑(VLAN 10)需要访问服务…

Windows 10 系统下的编程字体安装与配置(VSCode)教程

Windows 10 系统下的编程字体安装与配置教程 常见的优秀编程字体 开发者社区中有许多备受推崇的编程字体,它们都致力于提升代码的可读性和舒适度。以下是一些常见的选择: Fira Code: 以其丰富的编程连字(ligatures)而闻名&…

ITIL 4 高速IT:解耦架构——构建快速迭代的技术基座

一、为什么要解耦:从“架构”谈到“速度”1.高速IT的真正瓶颈:不是能力,而是架构在我们深入学习ITIL 4 高速IT的时候,大家可能都会有个疑问:为什么有些组织在数字化转型过程中推得动,有些却始终难以突破&am…

网络协议——MPLS(多协议标签转发)

一,基本概述1. mpls基本概念MPLS位于二三层之间,可以向所有网络层提供服务。通过在数据链路层和网络层之间增加额外的MPLS头部,基于MPLS头部实现数据快速转发。2. 控制平面和转发平面控制平面:负责产生和维护路由信息以及标签信息…

影刀RPA_初级课程_玩转影刀自动化_EXCEL操作自动化

声明:相关内容来自影刀学院,本文章为自用笔记,切勿商用!(若有侵权,请联络删除) 1. 数据的表达 1.1 列表 1.1 获取一段字符(字符串列表的截取 —— 前开后闭) 1.2 获取长…

当贝纯净版_海信ip811n海思mv320处理器安卓4.42及9.0主板优盘免拆刷机固件及教程

海信IP811N安卓4.4.2及安卓9.0主板免拆升级教程 下载固件之前,请拆机确认下主板处理器是否为 海思hi3798mv320处理器,拆机将主板上 位于中心位置的CPU芯片上的黑色贴纸取下 然后查看芯片第二行是否有V32字样,如下图 然后进入机顶盒设置&a…

三、平衡桥电路

一、电路结构 由于平衡桥后要连接双T型桥逆变电路并联,这里采用平衡桥电路来稳定母线和中线的电压平衡,使正母线电压BUS和负母线电压BUS-相对于中线的电压大小相等,极性相反,如50VBUS,-50BUS-。 平衡桥电路由两个电容…

Java-85 深入浅出 MySQL InnoDB 存储结构:Buffer Pool、写缓冲与日志机制全解

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) AI炼丹日志-30-新发布【1T 万亿】参数量大模型!Kim…

Linux救援模式之应用篇

挂载并访问文件系统1. 首先识别分区 fdisk -l # 查看所有磁盘和分区 lsblk # 以树状结构查看块设备 blkid # 查看分区的UUID和文件系统类型2. 创建挂载点并挂载分区 mkdir /mnt/rescue # 创建挂载点# 挂载根分区(根据你实际的根分区设备) mount /dev/…

【学习路线】游戏开发大师之路:从编程基础到独立游戏制作

前言 游戏开发是一个充满创意和技术挑战的领域,它融合了编程、美术、音效、设计等多个学科。随着游戏产业的蓬勃发展,游戏开发已成为最具吸引力的技术职业之一。本文将为您提供一条从零基础到游戏开发大师的完整学习路线,涵盖编程基础、游戏引…

宇树 G1 部署(九)——遥操作控制脚本 teleop_hand_and_arm.py 分析与测试部署

首先,我使用的是 v1.0 版本,宇树最近发力了更新的很快:xr_teleoperate-1.0 teleop_hand_and_arm.py 支持通过 XR 设备(比如手势或手柄)来控制实际机器人动作,也支持在虚拟仿真中运行。可以根据需要&#x…

第十一天:不定方程求解

每日一道C题:不定方程求解 问题:给定正整数a,b,c。求不定方程 axbyc 关于未知数x和y的所有非负整数解组数。 要求:输入一行,包含三个正整数a,b,c,两个整数之间用单个空格…

ElasticStack技术栈概述及Elasticsearch8.2.2集群部署并更换JDK版本为openjdk-17

ElasticStack 一、引言 在当今数据驱动的时代,如何高效地收集、处理和分析日志及其他类型的数据,已成为企业构建可观测性和运维能力的重要课题。Elastic Stack(早期称为 ELK Stack)是一套由 Elastic 公司推出的开源技术栈&#xf…