【JS】浅谈Promise

Promise

  • 前言
  • 一、Promise是什么?
  • 二、为什么用Promise?
    • 2.1解决回调地狱
    • 2.2 集中错误处理
    • 2.3代码解耦和复用
  • 三、做什么?
  • 四、原型方法和实例方法?
  • 五、应用场景?


前言

promise是es6的新规范,它是一种异步解决方案,主要为了解决回调地狱问题。
在这里插入图片描述

一、Promise是什么?

Promise是异步编程的一种解决方案,可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果。

Promise对象有三个状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。

  • 对象的状态不受外界影响,只有异步操作的结果,可以决定当前是哪一种状态
  • 一旦状态改变(从pending变为fulfilled和从pending变为rejected),就不会再变,任何时候都可以得到这个结果

二、为什么用Promise?

Promise是异步方案,主要用来处理异步操作。

2.1解决回调地狱

我们写项目经常会遇到一个方法中如果成功了,会接着执行下一个逻辑,很多时候层层嵌套,导致后续维护要阅读很长很长的代码。而用Promise封装后,后续可以复用并且不影响其他逻辑。

例如我有一个上传图片,需要我不停在图片上添加东西的功能

upLoadImg(path,name,function(data) {//加个地址upLoadImg(path1,name,function(data) {//加个时间upLoadImg(path2,name,function(data) {})})
});
function fn(data){//...return data1;
}
function upLoadImg(path,name){return new Promise((resolve, reject) => {  //...上传操作//成功let result = fn(data);resolve(result)//失败reject()}
}
upLoadImg('path','name') .then(data1 => {  return upLoadImg('path1', 'name1'); // 返回下一个Promise  
}).then(data2 => {  return upLoadImg('path2', 'name2'); // 返回下一个Promise  
}).catch(err => {  console.error( err);  
}); 

2.2 集中错误处理

而Promise通过catch方法提供了集中的错误处理机制,无论异步操作在链式调用的哪个环节失败,都可以在catch方法中统一处理。

2.3代码解耦和复用

通过将异步操作封装在Promise对象中,我们可以将异步逻辑与业务逻辑解耦,使得代码更加模块化和可复用。
比如上述拍照功能,还有常见的封装get和post请求
例如小程序我会调用手机相机进行拍照或者选择相册进行上传操作

uni.chooseImage({count: 6, //默认9sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有sourceType: ['album'], //从相册选择success: function (res) {//...业务逻辑}
});

这个业务逻辑有时候会让代码变得很长很长,试着改写一下

return new Promise((reslove, reject) => {uni.chooseImage({count: 6, //默认9sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有sourceType: ['album'], //从相册选择success: function (res) {reslove(res);}fail: () => {reject();}});

而我们用到的时候,直接 await 这个方法,进行接下来的逻辑。

三、做什么?

  • 封装异步操作

  • 链式调用:Promise的then方法返回一个新的Promise,可以链式地调用多个异步操作,并处理它们的结果。

  • 错误处理:Promise提供了catch方法来处理异步操作中可能发生的错误。

  • 状态管理:Promise对象具有三种状态:pending(等待中)、fulfilled(已成功)和rejected(已失败)。一旦Promise的状态从pending变为fulfilled或rejected,这个状态就不会再改变。

  • 组合异步操作:Promise提供了Promise.all、Promise.race等静态方法来组合多个异步操作。

四、原型方法和实例方法?

在这里插入图片描述

五、应用场景?

异步操作场景

  • 封装网络请求
  • 定时操作
  • 链式异步操作

在这里插入图片描述

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

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

相关文章

jmeter之常用函数-第六天

1.常见函数: _counter 计数器函数 TRUE(每个用户都有自己的计数器) FALSE(所有用户共用一个计数器) _Random 随机数函数 参数1:取值范围最小值(包含) 参数2:取值范围最大值(包含) _time 获取当前时间的函数 无参: 获取的是距离 1970/01/01 00:00:00 的毫秒值 参…

基于springboot的大学生租房平台系统

技术:springbootmysqlvue 一、系统背景 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对大学生租房信息管理混乱…

IT部门领导的角色与责任:在挑战中塑造未来

前言 在当今快节奏的商业环境中,IT部门领导扮演着至关重要的角色。他们需要具备技术专长,同时也需要展现出卓越的领导力来有效地管理团队和应对各种挑战。 一、技术创新的引领者 1. 重要角色转变 随着信息技术的迅猛发展,IT部门领导已逐渐…

【系统架构设计师】计算机系统基础知识 03

系统架构设计师 - 系列文章目录 01 系统工程与信息系统基础 02 软件架构设计 03 计算机系统基础知识 文章目录 系统架构设计师 - 系列文章目录 文章目录 前言 一、计算机系统概述 1.计算机组成 ​编辑2.存储系统 二、操作系统 ★★★★ 1.进程管理 2.存储管理 1.页式存储 …

EPRO PR6423/005-030 涡流位移传感器CSI 6500机械健康监测器

EPRO PR6423/005-030 涡流位移传感器CSI 6500机械健康监测器 描述 PR 6423是一种非接触式涡流传感器 具有坚固耐用的电流传感器 建造和设计用于 极其关键的涡轮机 诸如蒸汽的应用, 天然气、压缩机和水电 涡轮机、鼓风机和风扇。 置换的目的 探针用于测量位置或 …

《LeetCode热题100》笔记题解思路技巧优化_Part_4

《LeetCode热题100》笔记&题解&思路&技巧&优化_Part_4 😍😍😍 相知🙌🙌🙌 相识😢😢😢 开始刷题二叉树🟢1. 二叉树的中序遍历🟢2.…

在线虚拟农业展厅如何助力乡村企业展示升级?

数字化时代的乡村振兴:在线虚拟农业展厅的独特价值 随着互联网技术的迅速发展,传统农业正在经历一场前所未有的数字化革命。在线虚拟农业展厅,作为这一革命的重要组成部分,为乡村企业提供了一个全新的商品展示和销售平台。不同于传…

计算结构体的大小(结构体的内存对齐)

一:问题 问题所在:两个结构体应该都是6个字节大小,为什么一个12,一个6??? 二:如何正确的计算结构体大小? 首先得掌握结构体的对齐规则: 第一: 第一…

Head First Design Patterns -适配器模式与外观模式

适配器模式 什么是适配器模式 适配器模式,将一个类的接口转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作。 类图 代码 利用Enumeration来适配Iterator,外部只需要调用这个适配器,即可以像调用Iterator那样,…

代码随想录算法训练营 DAY 16 | 104.二叉树最大深度 111.二叉树最小深度 222.完全二叉树的节点个数

104.二叉树最大深度 深度和高度 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取…

模板高级使用(非类型模板参数,特化,分离编译)

文章目录 模板没有实例化取内嵌类型报错问题非类型模板参数模板的特化函数模板的特化类模板的特化1.全特化2.偏特化 模板的分离编译 模板没有实例化取内嵌类型报错问题 首先在这里分享一个模板的常见报错问题。就是模板的在没有实例化的情况下去取模板类里面的内嵌类型这时候的…

代码随想录算法训练营第十六天|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

代码随想录算法训练营第十六天|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数 104.二叉树的最大深度 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数…