跟着Promise的节奏,让你的代码脱颖而出

在这里插入图片描述

文章目录

  • Promise简介
  • Promise实例方法
    • 1. then(`onFulfilled`, `onRejected`)
    • 2. catch(`onRejected`)
    • 3. finally(`onFinally`)
    • 4. Promise.resolve(`value`)
    • 5. Promise.reject(`reason`)
    • 6. Promise.all(`iterable`)
    • 7. Promise.race(`iterable`)
  • Promise实例方法
    • 1. prototype.then(`onFulfilled`, `onRejected`)
    • 2. prototype.catch(`onRejected`)
    • 3. prototype.finally(`onFinally`)
  • Promise原型方法和实例方法的对比

Promise简介

Promise(承诺)是JavaScript中的一种异步编程解决方案,用于处理异步操作和避免回调地狱
它可以将异步操作封装成一个对象,通过链式调用来处理异步任务的完成状态(已完成、未完成、已失败)。

Promise有三种状态:

  • pending(进行中)
  • fulfilled(已完成)
  • ejected(已失败)

一旦Promise的状态发生改变,就无法再次变化。

创建Promise对象的方式是使用new关键字调用Promise构造函数,构造函数接受一个执行器函数作为参数。执行器函数会立即执行,并且接受两个参数:resolvereject。在执行器函数中,我们可以执行异步操作,并根据操作的结果调用resolve或reject函数来改变Promise的状态。

下面是一个简单的例子,展示了如何创建和使用Promise:

const myPromise = new Promise((resolve, reject) => {
  // 异步操作,比如发送网络请求等
  const success = true; // 假设请求成功

  if (success) {
    resolve("请求成功"); // 改变Promise状态为fulfilled,并传递一个值给后续的then方法
  } else {
    reject("请求失败"); // 改变Promise状态为rejected,并传递一个错误信息给后续的catch方法
  }
});

myPromise.then((result) => {
  console.log(result); // 请求成功时的处理逻辑
}).catch((error) => {
  console.error(error); // 请求失败时的处理逻辑
});

在上面的代码中,myPromise表示一个异步操作,如果成功,调用resolve函数并传递结果;如果失败,调用reject函数并传递错误信息。然后可以通过调用then方法来处理操作成功的情况,或者通过调用catch方法来处理操作失败的情况。

除了thencatch方法外,Promise还提供了其他一些方法,如finallyallrace等,用于更复杂的异步操作的处理

总结起来,Promise是一种用于处理异步操作的对象,它将异步操作封装成一个可以链式调用的对象,并提供了丰富的方法来处理操作的结果。通过使用Promise,可以更加清晰和简洁地编写异步代码。

Promise实例方法

Promise实例具有以下几个常用的方法:

1. then(onFulfilled, onRejected)

  • 该方法用于注册处理Promise对象状态变为fulfilled(已完成)时的回调函数onFulfilled,以及状态变为rejected(已失败)时的回调函数onRejected
  • 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。

2. catch(onRejected)

  • 该方法用于注册处理Promise对象状态变为rejected(已失败)时的回调函数onRejected。
  • 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。

3. finally(onFinally)

  • 该方法用于注册无论Promise对象的状态是fulfilled(已完成)还是rejected(已失败)时都会执行的回调函数onFinally。
  • 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。

4. Promise.resolve(value)

  • 该方法返回一个状态为fulfilled(已完成)且值为传入value的Promise对象。

5. Promise.reject(reason)

  • 该方法返回一个状态为rejected(已失败)且原因为传入reason的Promise对象。

6. Promise.all(iterable)

  • 该方法接受一个可迭代对象(如数组),并返回一个新的Promise对象。
  • 当可迭代对象中的所有Promise对象都变为fulfilled(已完成)状态时,返回的Promise对象状态也会变为fulfilled,并返回一个由每个Promise对象值组成的数组。
  • 如果可迭代对象中的任意一个Promise对象变为rejected(已失败)状态,则返回的Promise对象状态会立即变为rejected,并传递第一个被拒绝的Promise的原因。

7. Promise.race(iterable)

  • 该方法接受一个可迭代对象(如数组),并返回一个新的Promise对象。
  • 当可迭代对象中的任意一个Promise对象的状态发生改变时(无论是fulfilled还是rejected),返回的Promise对象的状态也会相应地发生改变,且与第一个发生改变的Promise对象保持一致。

这些方法提供了灵活的处理异步操作的方式,可以根据需要进行链式调用、捕获错误、执行最终的清理操作等。

Promise实例方法

Promise原型(prototype)上有以下几个常用的方法:

1. prototype.then(onFulfilled, onRejected)

  • 该方法用于注册处理Promise对象状态变为fulfilled(已完成)时的回调函数onFulfilled,以及状态变为rejected(已失败)时的回调函数onRejected
  • 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。

2. prototype.catch(onRejected)

  • 该方法用于注册处理Promise对象状态变为rejected(已失败)时的回调函数onRejected
  • 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。

3. prototype.finally(onFinally)

  • 该方法用于注册无论Promise对象的状态是fulfilled(已完成)还是rejected(已失败)时都会执行的回调函数onFinally
  • 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。

这些原型方法与实例方法具有相同的功能,可以在Promise实例上直接调用。它们提供了处理异步操作的灵活方式,可以根据需要注册不同的回调函数,处理成功和失败的情况,并在最终完成时执行清理操作。

同时,在原型上还有其他一些方法,例如:

  • prototype.resolve(value): 返回一个状态为fulfilled(已完成)且值为传入value的Promise对象。
  • prototype.reject(reason): 返回一个状态为rejected(已失败)且原因为传入reason的Promise对象。
  • prototype.all(iterable): 静态方法Promise.all()的实现,接受一个可迭代对象(如数组),返回一个新的Promise对象。
  • prototype.race(iterable): 静态方法Promise.race()的实现,接受一个可迭代对象(如数组),返回一个新的Promise对象。

这些原型方法使得我们可以直接在Promise构造函数的原型上调用相应的方法,而不需要创建实例来使用它们。

Promise原型方法和实例方法的对比

以下是Promise原型方法和实例方法的对比总结表格:

方法作用在原型上调用在实例上调用
then注册处理Promise对象状态变为fulfilled时的回调函数以及状态变为rejected时的回调函数Promise.prototype.then()promiseInstance.then()
catch注册处理Promise对象状态变为rejected时的回调函数Promise.prototype.catch()promiseInstance.catch()
finally注册无论Promise对象的状态是fulfilled还是rejected时都会执行的回调函数Promise.prototype.finally()promiseInstance.finally()
resolve返回一个状态为fulfilled且值为传入value的Promise对象Promise.resolve()不适用
reject返回一个状态为rejected且原因为传入reason的Promise对象Promise.reject()不适用
all接受一个可迭代对象,当所有Promise对象都为fulfilled状态时返回一个由每个Promise值组成的数组Promise.all()不适用
race接受一个可迭代对象,返回第一个变为fulfilled或rejected状态的Promise对象的结果Promise.race()不适用
其他非实例特有方法resolve, reject, all, race等方法在原型上实现,用于直接在原型上调用,不需要创建Promise实例Promise.resolve(), Promise.reject(), 等等不适用

需要注意的是,原型方法可以直接在Promise构造函数的原型上调用,而实例方法需要在具体的Promise实例上调用。另外,resolverejectallrace等方法是非实例特有的静态方法,用于直接在原型上调用,而不需要创建Promise实例。

这些方法提供了灵活的处理异步操作的方式,并且可通过链式调用来处理多个异步操作的完成状态。

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

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

相关文章

基于springboot+Redis的前后端分离项目(八)-【黑马点评】

🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码:eh11 好友关注&Feed流 (一)好友关注-关注和取消关注(二)好友关注-共同关注(三) 好友…

mfc120u.dll丢失修复,mfc120u.dll缺失的解决方法

MFC120u.dll缺失的原因 当系统中缺少或损坏了MFC120u.dll文件时,就会出现"MFC120u.dll缺失"的错误提示。造成MFC120u.dll缺失的原因可能有以下几种情况: 1.文件删除或损坏:MFC120u.dll文件可能因为误删除、病毒感染、硬盘故障等原…

Vue--》Vue3打造可扩展的项目管理系统后台的完整指南(十一)

今天开始使用 vue3 + ts 搭建一个项目管理的后台,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本专栏…

Jmeter上传文件接口测试

Jmeter上传文件接口测试 接口测试,想必大家都做过,但是上传文件的接口,可能就不知所措。其实呢,还是那么回事~ 一、接口的业务 在接口文档缺失的前提下,那就从抓包玩起~Fiddler或者F12都可以。 本次我们接口实现的…

python验证公网ip与内网ip

什么是公网IP 公网IP(Public IP)是指在互联网中全球唯一标识一个设备或网络的IP地址。它是供公众访问和通信的IP地址。 公网IP是由互联网服务提供商(ISP)分配给用户或组织的,它允许设备通过互联网与其他设备进行通信…

如何高效的开展app的性能测试

目录 APP性能测试是什么 APP性能测试怎么做 性能测试场景的设计 性能指标的定义 规范化执行流程 性能数据数据收集 性能数据分析 性能问题定位 性能测试报告 APP性能测试是什么 从网上查了一下,貌似也没什么特别的定义,我这边根据自己的经验给出…

3.清除浮动

3.1 为什么需要清除浮动? 由于父级盒子在很多情况下,不方便给高度,但是子盒子浮动又不占有位置,最后父级盒子高度为0时,就会影响下面的标准流盒子。 ●由于浮动元素不再占用原文档流的位置,所以它会对后面的元素排…

进制转换解析

进制 进制介绍 对于整数,有四种表示方式: 二进制:0,1 ,满 2 进 1.以 0b 或 0B 开头。 十进制:0-9 ,满 10 进 1。 八进制:0-7 ,满 8 进 1. 以数字 0 开头表示。 十六进制&#xff1…

Spring Boot 中的 Spring Cloud Feign

Spring Boot 中的 Spring Cloud Feign Spring Boot 是一个非常流行的 Java Web 开发框架,它提供了很多工具和组件来简化 Web 应用程序的开发。其中,Spring Cloud Feign 是 Spring Boot 中的一个非常重要的组件,它可以帮助我们实现声明式的 R…

VSCode中打开NodeJS项目自动切换对应版本的配置

这几年搞了不少静态站点,有的是Hexo的,有的是VuePress的。由于不同的主题对于NodeJS的版本要求不同,所以本机上不少NodeJS的版本。 关于如何管理多个NodeJS版本,很早之前就写过用nvm来管理的相关文章,这里就不赘述了&a…

拼多多商品参数怎样复制(实用小技巧分享)

拼多多是一家以拼团购物为主打的电商平台,拼多多的商品信息非常详细,包括商品的价格、规格、型号、颜色、尺寸等多种参数。当我们需要在拼多多上发布商品或者参与拼团购物时,可能需要复制商品参数,那么拼多多商品参数怎样复制呢&a…

MySQL实战解析底层---“order by“是怎么工作的

目录 前言 全字段排序 rowid排序 全字段排序 VS rowid排序 前言 在开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求以举例市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓…

深度学习常用激活函数总结

激活函数的特点 非线性。引入非线性能提升模型的表达能力可微分。如果激活函数不可微,那就无法使用梯度下降方法更新参数非饱和性。饱和指在某些区间上激活函数的梯度接近于零,使参数无法更新取值范围有界。这样可以使网络更稳定,即使有很大…

SSM项目前后端分离+IDEA运行环境(含前端源码)(个人博客系统)

目录 后端项目环境配置 1、创建一个SpringBoot项目,添加MyBatis框架和数据库MySQL驱动依赖 2、配置项目文件:application.yml 3、创建数据库表 4、创建分层结构目录 返回统一数据格式 创建统一数据格式返回类:AjaxResult 创建实现统一…

软件测试面试题(带答案)

1. 请自我介绍一下(需简单清楚的表述自已的基本情况,在这过程中要展现出自信,对工作有激情,上进,好学) 面试官您好,我叫###,今年26岁,来自广东深圳,就读专业是电子商务,…

Golang学习——string和slice切片

Golang学习——string和slice切片 string整数存储字符存储Unicode存储变长编码规则字符串类型变量的结构字符串变量的修改方式 slice通过make的方式定义变量new底层数组slice扩容规则1.预估扩容后的容量newCap2.newCap个元素需多大内存3.匹配到合适的内存规格练习 string 整数…

Cyclo(Leu-Leu),952-45-4,环(亮氨酸-亮氨酸),进行总结说明

(文章资料汇总来源于:陕西新研博美生物科技有限公司小编MISSwu)​ ●中文名:环(亮氨酸-亮氨酸) ●英文名:Cyclo(-Leu-Leu),Cyclo(L-leucyl-L-leucyl),Cyclo(Leu-Leu) ●…

二叉树OJ实战

目录 二叉树某一节点X祖先节点的交集(证明题) LeetCode_100. 相同的树 LeetCode_965. 单值二叉树 LeetCode_101. 对称二叉树 LeetCode_226. 翻转二叉树 LeetCode_112. 路径总和 LeetCode_113. 路径总和 II LeetCode_110. 平衡二叉树 LeetCode_9…

第一章:光纤通信概述

第一节:通信基本概念 1.1光纤通信基本概念 1.1.1光纤通信的概念 利用光导纤维传输广播信号的通信方式称为光纤通信。光波主要包括紫外线、可见光和红外线。光纤通信工作波长在近红外区,0.8um~1.8um的波长区,频率为167THz~375THz。光纤基础…

Nuxt3引入Element-plus和sass

1.引入Element-plus 打开编辑器终端 运行npm install element-plus/nuxt 或者命令行cd到项目文件 运行npm install element-plus/nuxt package.json文件会出现 使用Element-plus 在nuxt.config.ts文件添加代码 export default defineNuxtConfig({devtools: { enabled: true }…