promise的作用

news/2024/3/29 12:39:46/文章来源:https://blog.csdn.net/qq_52421092/article/details/130361827

为什么要用promise、它的作用是什么、解决了什么问题?

1、Promise对象可以理解为一次执行的异步操作,使用promise对象之后可以使用一种链式调用的方式来组织代码;让代码更加的直观。

2、有了Promise对象,就可以将异步操作以同步的操作的流程表达出来,避免了层层嵌套的回调函数。

总结:就是可以将原先不可控的回调通过promise转为更加可控更清晰的方式表达,更加高效,更便于维护。

一、案例讲解

接下来从0开始理解:比如我们想要延迟1秒执行一段代码,于是就把这段代码写到一个定时器里,这个定时器里的回调函数就是一个异步操作。

setTimeout(()=>{console.log('我想在1秒后执行这行代码')
},1000)

但我们还想要等这段代码执行完时执行别的代码,可我们不知道这段代码什么时候执行完,那怎么办?凭直觉讲,那就直接把别的代码写到那段代码后面就行了呗,像这样:

setTimeout(()=>{console.log('我想在1秒后执行这行代码')console.log('我想在前面的执行完之后执行')
},1000)

看似轻松地解决了问题,但如果别的代码还是一个异步操作呢

setTimeout(()=>{console.log('我想在1秒后执行这行代码')setTimeout(()=>{console.log('我想在前面的执行完后2秒执行')},2000)
},1000)

显而易见,会一层套一层。之前写socket编程时,会有很多的异步网络请求,就这样各种嵌套回调,代码变得很复杂,也更难维护。同时,每一个异步函数的执行上下文(作用域)就被限制在这个setTimout的回调里面了,多个回调之间就难以建立联系。

Promise是怎么通知我们异步操作结束了的呢?来实践一下。

先把我们的异步操作放到Promise对象里面去:

let p = new Promise((resolve, reject)=>{setTimeout(()=>{console.log('我想在1秒后执行这行代码')},1000)}
)

在new这个Promise时,构建器函数(就是(resolve,reject)=>{})也会立即开始执行,我们的异步操作也就在其中执行了。不过这看起来好像和之前的方式没什么区别呀,就是放到了一个对象里面嘛。不着急,来看构造器函数的参数:resolvereject函数(由JavaScript引擎定义好的),这就是Promise的用处所在,这两个函数就是一个“通知”,来告诉我们异步操作的状态,我们在上述代码中做出修改:

let p = new Promise((resolve, reject)=>{setTimeout(()=>{console.log('我想在1秒后执行这行代码')resolve()},1000)}
)

这里在第5行增加了一个resolve(),一旦执行了resolve(),就相当于发出了一个通知说“这个异步操作完成啦”,这个通知写在哪里是由你来定的,不过当然是要在异步操作执行结束后进行通知啦(这里不展开讲reject()了,同理)。那么,虽然通知发出去了,别的代码(console.log('我想在前面的执行完之后执行'))怎么知道上一个异步操作执行结束了呢?这就需要接收到那个通知,then()就是负责接收通知的,一旦resolve()了,就会进入then()里面,把别的代码写到then()里面就可以啦!(关于then的参数以及与catch的异同不展开了)

let p = new Promise((resolve, reject)=>{setTimeout(()=>{console.log('我想在1秒后执行这行代码')resolve()},1000)}
).then(()=>{console.log('我想在前面的执行完之后执行')}
)

而回调嵌套回调的代码也解开了嵌套,变成了:

let p = new Promise((resolve, reject)=>{setTimeout(()=>{console.log('我想在1秒后执行这行代码')resolve()},1000)}
).then(()=>{setTimeout(()=>{console.log('我想在前面的执行完后2秒执行')},2000)}
)

这就是Promise的作用所在了。

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

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

相关文章

开放式耳机有什么好处,盘点几款性能不错的开放式耳机

随着人们对生活质量要求的提高,大家在运动的时候都喜欢戴上耳机,享受运动的乐趣。但是传统耳机戴久了之后就会出现耳朵酸痛的情况,这是因为传统耳机佩戴方式是通过空气振动来传递声音,而人在运动时就会伴随着大量的汗水&#xff0…

深入学习RabbitMQ五种模式(一)

1.安装erlang 下载otp_win64_25.3.exe https://www.erlang.org/downloads erlang安装完成,需要配置erlang环境变量 ERLANG_HOMEE:\software\Erlang OTPPATH%PATH%;%ERLANG_HOME%\bin; 2.安装RabbitMQ 下载rabbitmq-server-3.11.13.exe https://www.rabbitmq.com/dow…

【Python 协程详解】

0.前言 前面讲了线程和进程,其实python还有一个特殊的线程就是协程。 协程不是计算机提供的,计算机只提供:进程、线程。协程是人工创造的一种用户态切换的微进程,使用一个线程去来回切换多个进程。 为什么需要协程? …

IntelliJ IDEA 接入ChatGPT (免费,无需注册)生产力被干爆了!

IntelliJ IDEA 接入ChatGPT 前言 : 今天给大家介绍一款好用的 IntelliJ IDEA ChatGPT 插件 可以帮助我们写代码,以及语言上的处理工作,以及解释代码。让我们的生产力大大提高! 一. ChatGPT-Plus 功能介绍 支持最新idea版本AI询问功能,写好…

Adobe Photoshop 软件下载

Adobe Photoshop,简称“PS”,是由Adobe Systems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。 时至今日,Adobe Photoshop 已经成为当今世界上最流行、应用最广泛的图像处理软件。不但设计专业的学生要系统的学习这个…

智能建筑中电力监控系统的应用与产品选型

摘要:近几十年,中国现代化经济不断发展,计算机技术、信息技术等相关产业也取得了飞跃性的进步。随着商业、生活以及公共建筑不断提高智能管理和节能的要求,电力监控系统开始逐渐渗入人们的日常生活,发挥着不可替代的作…

算法刷题|0-1背包问题、416.分割等和子集

0-1背包问题 什么是0-1背包? 有i个物品和一个容量为j的背包,每个物品有重量和价值两个属性;求容量为j的背包能装的物品的最大价值是多少。每个物品智能使用一次。 二维dp数组 dp[i][j]的含义:表示从前i个物品中,当前…

C++中引用的基本内容

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C之路】 引用,其实没啥特别的,就是起外号,或者说起小名。就比如说孙悟空就有很多外号,如…

为何C语言的函数调用要用到堆栈,而汇编却不需要自定义栈

一 ≠ 汇编不需要堆栈 汇编中一般不初始化,也就是直接使用系统的堆栈而已,自己定义堆栈还是要初始化的。 之前看了很多关于uboot的分析,其中就有说要为C语言的运行,准备好堆栈。 而自己在Uboot的start.S汇编代码中&#xff0c…

一文详细介绍查看和启用nginx日志(access.log和error.log),nginx错误日志的安全级别,自定义访问日志中的格式

文章目录 1. 文章引言2. Nginx访问日志(access.log)2.1 简述访问日志2.2 启用Nginx访问日志2.3 自定义访问日志中的格式 3. Nginx错误日志(error.log)3.1 简述错误日志3.2 启用错误日志3.3 Nginx错误日志的安全级别 4. 文末总结 1. 文章引言 我们在实际工作中,经常使…

学习spark笔记

✨ 学习 Spark 和 Scala 一 ​ 🐦Spark 算子 spark常用算子详解(小部分算子使用效果与描述不同) Spark常用的算子以及Scala函数总结 Spark常用Transformations算子(二) Transformation 算子(懒算子):不会提交spark作业&#…

SLAM论文速递:SLAM—— 流融合:基于光流的动态稠密RGB-D SLAM—4.25(2)

论文信息 题目: FlowFusion:Dynamic Dense RGB-D SLAM Based on Optical Flow 流融合:基于光流的动态稠密RGB-D SLAM论文地址: https://arxiv.org/pdf/2003.05102.pdf发表期刊: 2020 IEEE International Conference on Robotics and Automa…

flex布局属性详解

Flex布局 flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-content其他orderflexalign-self 含义:Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。 flex-direction flex-direction属性决定主轴的方向&…

危险区域闯入识别系统 yolov8

危险区域闯入识别系统通过YOLOv8网络模型技术,危险区域闯入识别系统对现场画面中发现有人违规闯入禁区,系统立即抓拍告警同步回传后台。YOLOv8 提供了一个全新的 SOTA 模型,包括 P5 640 和 P6 1280 分辨率的目标检测网络和基于 YOLACT 的实例…

Model-Contrastive Federated Learning 论文解读(CVPR 2021)

Model-Contrastive Federated Learning 论文解读 对比学习SimCLR 对比学习的基本想法是同类相聚,异类相离 从不同的图像获得的表征应该相互远离,从相同的图像获得的表征应该彼此靠近 具体框架: T随机数据增强模块:随机裁剪然…

光波导相控阵技术

在简述电光效应和热光效应的基础上综述了国内外光波导相控阵技术研究进展,包括一维和二维光波导相控阵的技术途径、结构特点和性能指标,给出了光波导相控阵的优势以及在激光雷达、成像等领域的应用前景。结果表明,光波导相控阵技术正向着大扫…

JavaScript Debugger 调试断点模式

在代码中加入debugger,相当于断点停顿,可用于查看变量传递情况,比如:Vue组件中生命周期onLoad(options) ,在上一页面进入下一页面后,传递进来的参数值。 备注 :options 参数为字符串&#xff0…

从需求分析到上线发布,一步步带你开发收废品小程序

在如今的环保和可持续性的大趋势下,废品回收已经成为了人们日常生活中不可或缺的一部分。收废品小程序的开发可以帮助人们更方便地找到回收废品的地点,并有效减少废品对环境造成的污染。因此,我们的收废品小程序需要满足以下需求:…

2023年电信推出新套餐:月租19元=135G流量+长期套餐+无合约期!

在三大运营商推出的流量卡当中,电信可以说是性价比最高的一个,相对于其他两家运营商,完全符合我们低月租,大流量的要求,所以,今天小编介绍的还是电信流量卡。 在这里说一下,小编推荐的卡都是免…

中国制造再击败一家海外企业,彻底取得垄断地位

中国制造已在13个行业取得领先优势,凸显出中国制造的快速崛起,日前中国制造又在一个行业彻底击败海外同行,再次证明了中国制造的实力。 一、海外企业承认失败 提前LGD宣布它位于广州的8.5代液晶面板生产线停产,预计该项目将出售给…