【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, //默认9
	sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
	sourceType: ['album'], //从相册选择
	success: function (res) {
		//...业务逻辑
	}
});

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

return new Promise((reslove, reject) => {
	uni.chooseImage({
		count: 6, //默认9
		sizeType: ['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等静态方法来组合多个异步操作。

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

在这里插入图片描述

五、应用场景?

异步操作场景

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

在这里插入图片描述

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

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

相关文章

粗糙度对应表,觉得挺实用

粗糙度新老标准经常会遇到,分享给大家

大数据分析师特训营介绍

大数据分析师是做什么的? 数据分析师是在不同行业中,专门从事行业数据搜集、整理、分析,并依据数据做出行业研究、评估和预测等工作的。与传统的数据分析师相比,大数据分析师要学会打破信息孤岛利用各种数据源,在海量…

ByteTrack多目标跟踪——YOLOX详解

文章目录 1 before train1.1 dataset1.2 model 2 train2.1 Backbone2.2 PAFPN2.3 Head2.3.1 Decoupled Head2.3.2 anchor-free2.3.3 标签分配① 初步筛选② simOTA 2.3.4 Loss计算 项目地址: ByteTrack ByteTrack使用的检测器是YOLOX,是一个目前非常流行…

Ceres求解非线性优化问题步骤与示例

【版权声明】 本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。 在计算机视觉和机器人领域,经常需要解决非线性优化问题来估计相机姿态或运动模型。Ceres Solver是一个开源的C库,专门用于解决最小二乘问题&am…

Linux系统如何使用tcpdump实时监控网络速度:方法与技巧解析

在网络管理和故障排查中,了解网络速度是一个重要的环节。而tcpdump,作为一个强大的网络数据包分析工具,不仅可以用于分析数据包的内容,还能用于实时监控网络速度。本文将介绍Linux系统如何使用tcpdump来实时监控网络速度。 首先&…

智能型程控直流电子负载特点和特性

智能型程控直流电子负载是高精度、高稳定性的电源测试设备,主要用于对电源、电池、充电器等直流电源设备的输出性能进行测试。它具有以下特点和特性: 智能型程控直流电子负载采用先进的控制算法和高精度的ADC,能够实现对电流、电压、功率等参…

【EOJ】2985.圆和正方形

单点时限: 2.0 sec 内存限制: 256 MB 小王首先在平面上画一个边长为 K 的正方形 S1,然后又画一个 S1 的内切圆 C1,这算做一次操作。然后接着画 C1 的一个内切正方形 S2,和 S2 的一个内切圆 C2,这算第二次操作。他一直进行了 K 次…

前端学习笔记 | JS进阶

一、作用域 1、局部作用域 (1)函数作用域 (2)块作用域 let和const会产生块作用域 ,而var不会产生块作用域 2、全局作用域 script标签和js文件的【最外层】变量 3、作用域链 本质:底层的变量查找机制 4、JS…

AI时代,我靠2个页面,一个AI产品开始变现

大家好,我是AI时间线的作者,AI时间线这个产品是我利用过年期间半天时间开发出来的一个产品。 产品地址:http://www.ai-timeline.top/ 核心功能主要是根据关键词生成时间线,大家可以看看产品上使用教程,非常简单 当然幸运的是目前产…

解决:springboot项目访问hdfs文件提示guava版本不兼容

1、问题描述 版本说明:我用的hadoop版本:3.1.3 项目可以正常启动,但是调用访问hdfs的服务时候报错,报错消息如下:com.google.common.base.preconditions.checkArgument(ZL java/lang/String;Ljava/lang/Object:)V 原因分析&#x…

安科瑞保护测控产品在新能源行业中应用【峰谷套利 动态扩容 需求侧响应】

背景 2 月 10 日发布《关于完善能源绿色低碳转型体制机制和措施的意见》明确,鼓励建设源网荷储一体化、多能互补的智慧能源系统和微电网。 分布式光伏优势 近年来,随着光伏产业规模不断扩大,技术迭代升级不断加快,智能制造迅速推…

如何让工作计划显示在桌面上面?电脑桌面日程安排软件

作为一名忙碌的上班族,我每天都要面对繁多的工作任务,如何确保每一项任务都能按时完成,避免遗漏或忘记,成为了我必须面对的挑战。提前列出工作计划固然有效,但如果能将这些计划直接显示在电脑桌面上,无疑将…

uniapp_微信小程序客服

一、调用api 二、代码 <button open-type"contact">客服</button> 三、小程序后台添加客服人员就行

应急响应靶机训练-Web3题解

前言 接上文&#xff0c;应急响应靶机训练-Web3。 前来挑战&#xff01;应急响应靶机训练-Web3 题解 首先登录用户administrator 寻找隐藏用户 找到隐藏用户hack6618$ 然后去找apache的日志文件 分析得出两个IP地址 192.168.75.129 192.168.75.130 然后更换hack6618$的…

几个好用的AI网站(视频/图片/论文/PPT生成)直接给链接

引入 随着人工智能技术的飞速发展&#xff0c;越来越多的AI创作工具开始涌现&#xff0c;它们不仅能够帮助我们提升写作效率&#xff0c;更能激发创作灵感。今天&#xff0c;就让我们一起来探索十个值得一试的AI网站&#xff0c;它们分别是sora、mused.org、英伟达本地AI、瑞达…

将MySQL数据库在idea中引入

输入SQL语句后运行即可

单片机第四季-第二课:uCos2源码-BSP

1&#xff0c;初始uCos2 文件中uC开头的为uCos相关的。 2&#xff0c;uCos2源码工程建立 建立Source Insight工程 寻找main函数 (1)RTOS其实就是一个大的裸机程序&#xff0c;也是从main开始运行的 (2)main之前也是有一个汇编的启动文件的 (3)main中调用了很多初始化函数 bsp部…

智慧交通运维合集:基于图扑数字孪生技术的解决方案

城市交通作为城市与区域交通体系的核心&#xff0c;其完善程度和发展水平是评价城市现代化水准的关键指标之一。 城市交通数字孪生技术正在成为城市交通管理的关键工具&#xff0c;支持系统的高效运行和安全保障。随着互联网、大数据和人工智能技术的进步&#xff0c;城市交通…

自写系统运行windows程序

运行已经基本正常了。 源代码在 https://gitee.com/enrique11/cxos.git

C++除了Qt还有什么GUI库?

C除了Qt还有什么GUI库&#xff1f; 先&#xff0c;不要折腾&#xff0c;不要想着用 C 来做 App 类的 GUI 开发。 所以你问用 c gui 库&#xff0c;本来确实有很多&#xff0c;但是经过几十年的沉淀&#xff0c;最后只留下一个 qt quick 和其他特殊需求的库&#xff08;包括 qt…