JavaScript Promise 功能 用法运用 详解

news/2025/3/10 21:22:33/文章来源:https://www.cnblogs.com/baisemoshui/p/18763702

JavaScript Promise 功能、用法与运用详解

一、功能

Promise 是 JavaScript 中用于处理异步操作的一种机制。它代表了一个异步操作的最终完成(或失败)及其结果值。Promise 的主要功能是:

  1. 避免回调地狱:在异步编程中,当需要处理多个异步操作时,回调函数容易相互嵌套,形成“回调地狱”。Promise 通过链式调用的方式,可以清晰地组织异步代码,提高代码的可读性和可维护性。
  2. 状态管理:Promise 有三种状态:Pending(进行中)、Fulfilled(已成功)和 Rejected(已失败)。通过状态管理,可以清晰地知道异步操作的结果。
  3. 错误处理:Promise 提供了 .catch() 方法,可以捕获异步操作中的错误,并进行统一处理。

二、用法

1. 创建 Promise

使用 new Promise() 构造函数来创建一个 Promise 对象。构造函数接受一个执行器函数(executor function)作为参数,该函数有两个参数:resolvereject

  • resolve:当异步操作成功时调用,将 Promise 的状态变为 Fulfilled,并传递一个值作为操作的结果。
  • reject:当异步操作失败时调用,将 Promise 的状态变为 Rejected,并传递一个错误对象作为失败的原因。

示例

const promise = new Promise((resolve, reject) => {// 模拟异步操作setTimeout(() => {const success = true;if (success) {resolve("操作成功");} else {reject(new Error("操作失败"));}}, 1000);
});

2. 使用 then 和 catch

  • .then():用于指定 Promise 状态变为 Fulfilled 时要执行的操作。它接受两个参数:

    • 第一个参数是处理 Fulfilled 状态的回调函数,该回调函数会接收 resolve 函数传递的值。
    • 第二个参数是可选的,用于处理 Rejected 状态的回调函数,该回调函数会接收 reject 函数传递的错误对象。
  • .catch():用于捕获 Promise 链中的错误。它相当于 .then(null, onRejected),即只处理 Rejected 状态。

示例

promise.then((result) => {console.log(result); // 输出 "操作成功"}).catch((error) => {console.error(error); // 如果操作失败,输出错误信息});

3. 链式调用

Promise 支持链式调用,即可以在一个 .then() 方法后继续调用另一个 .then() 方法。每个 .then() 方法都会返回一个新的 Promise 对象,这样可以将多个异步操作串联起来。

示例

promise.then((result) => {console.log(result); // 输出 "操作成功"return new Promise((resolve) => {setTimeout(() => {resolve("第二个异步操作完成");}, 1000);});}).then((result) => {console.log(result); // 输出 "第二个异步操作完成"}).catch((error) => {console.error(error); // 捕获错误});

4. finally 方法

.finally() 方法用于指定无论 Promise 的状态是 Fulfilled 还是 Rejected,都会执行的操作。它不接受任何参数,其回调函数没有返回值。

示例

promise.then((result) => {console.log(result); // 输出 "操作成功"}).catch((error) => {console.error(error); // 捕获错误}).finally(() => {console.log("异步操作完成"); // 无论结果如何,都会执行});

三、高级用法

1. Promise.all

Promise.all() 方法用于并行执行多个 Promise 对象,并在所有 Promise 对象都变为 Fulfilled 时,返回一个新的 Promise 对象,其决议值是一个包含所有 Promise 对象决议值的数组。如果有任何一个 Promise 对象变为 Rejected,则返回的 Promise 对象也会变为 Rejected,并传递第一个被拒绝的 Promise 对象的拒绝理由。

示例

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);Promise.all([promise1, promise2, promise3]).then((results) => {console.log(results); // 输出 [1, 2, 3]}).catch((error) => {console.error(error); // 捕获错误});

2. Promise.race

Promise.race() 方法返回一个新的 Promise,该 Promise 在其第一个完成的 Promise(无论是 Fulfilled 还是 Rejected)解决或拒绝后,以相同的解决值或拒绝理由解决或拒绝。

示例

const promise1 = new Promise((resolve) => setTimeout(resolve, 500, 'one'));
const promise2 = new Promise((resolve) => setTimeout(resolve, 100, 'two'));Promise.race([promise1, promise2]).then((value) => {console.log(value); // 输出 "two",因为 promise2 先完成}).catch((error) => {console.error(error); // 捕获错误});

3. Promise.allSettled

Promise.allSettled() 方法接收一个 Promise 对象数组,并返回一个在所有给定的 Promise 都已解决或被拒绝后解析的新 Promise,并带有一个对象数组,每个对象表示对应的 Promise 结果。

示例

const promise1 = Promise.resolve(1);
const promise2 = Promise.reject(new Error('2'));
const promise3 = Promise.resolve(3);Promise.allSettled([promise1, promise2, promise3]).then((results) => {console.log(results);/* 输出:[{ status: 'fulfilled', value: 1 },{ status: 'rejected', reason: Error: 2 },{ status: 'fulfilled', value: 3 }]*/}).catch((error) => {console.error(error); // 捕获错误});

四、运用

Promise 在 JavaScript 异步编程中有广泛的应用场景,包括但不限于:

  1. 网络请求:使用 fetch API 或 axios 等库发起网络请求,并处理响应结果。

  2. 文件操作(在 Node.js 环境中):使用 fs.promises API 进行文件读取、写入等操作。

  3. 定时器:使用 setTimeoutsetInterval 模拟异步操作,并结合 Promise 进行处理。

  4. 异步流程控制:通过 Promise 的链式调用和静态方法,实现复杂的异步流程控制。

五、总结

Promise 是 JavaScript 中处理异步操作的重要工具,它通过状态管理、链式调用和错误处理等功能,极大地简化了异步编程的复杂性。在实际开发中,可以根据具体需求选择合适的 Promise 用法,并结合 async/await 等语法糖,编写出更加简洁、易读的异步代码。

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

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

相关文章

CF2068E. Porto Vs. Benfica

Porto Vs. Benfica 翻译自官方题解。我们首先做一些定义,这将帮助我们: 定义。 用 \(f(v)\) 表示支持者俱乐部从顶点 \(v\) 出发,想要到达顶点 \(n\) 所需的最少道路数,且警察仍然可以封锁恰好一条道路。 因此,\(f(1)\) 是问题的答案,且 \(f(n) = 0\)。 定义。 用 \(g(v,…

使用 Power Automate发送图文并茂的Teams消息

前言最近,有朋友使用Automate发送Teams消息,发现如果图片在SharePoint中,发送的时候因为认证的问题图片没办法显示。其实,我们可以将图片转换成Base64流进行引用,就能正常的显示了。正文1.我们新建一个Automate Flow,如下图:2.然后,添加Teams操作,如下图:3.消息我们需…

006TypeScript开发实战

一、全家桶-状态管理 状态管理的选择 vuex:目前依然使用较多的状态管理库 pinia:强烈推荐,未来趋势的状态管理库(用这个)1、 安装:npm install pinia 安装完成 2、新建文件夹 这里这样写 这里引入pinia 新建文件 这样写 这里引用一下 可以看到页面上 点击之后变成

《Python极客项目编程(第2版)》 | PDF免费下载 | epub free download

本书并不介绍Python语言的基础知识,而是通过一系列有趣的项目,展示如何用Python解决各种实际问题,以及如何使用一些流行的Python库。点击下载书籍信息 作者: [美] 马赫什文基塔查拉姆(Mahesh Venkitachalam) 出版社: 人民邮电出版社 原作名: Python Playground: Geeky Pro…

课堂教学质量评价分析系统 AI+教育

课堂教学质量评价分析系统的核心技术基于YOLOv11和CNN算法,课堂教学质量评价分析系统检测到的行为数据(如玩手机、举手、睡觉、交头接耳、趴桌子、行走运动)和表情数据(如开心、厌恶、愤怒、悲伤、沮丧、恐惧、无表情)会被传递到情感模型进行进一步分析。同时,系统还会结…

04. 串口通信

一、串口通信简介串口通信是一种设备间常用的串行通信方式,串口按位(bit)发送和接收字节。串口通信的数据包由发送设备的 TXD 接口传输到接收设备的 RXD 接口。在串口通信的协议层中,规定了数据包的内容,它由起始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式…

【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享

问题描述 当在AKS中遇见复杂的网络问题,想要进入到特定的POD中来抓取网络文件包进行分析。特分享抓取网络包的方法!操作步骤 第一步:使用kubectl get pods命令确认问题Pod所在的Node 第二步:使用node shell登录到相应node上 kubectl node-shell <node name> 第三步:…

App虚拟机环境搭建

App虚拟机环境搭建 在uniapp的开发环境中,我想要搭建一个平台完成对于app的开发,所以要配置app的基本环境和安装虚拟机 虚拟机安装 这里使用Mumu虚拟机.直接从官网下载然后傻瓜式安装https://mumu.163.com/搭建环境 主要是给虚拟机的接口和abd.exe文件的地址找到,配置到HBuilde…

nodejs的下载安装

首先进入官网https://nodejs.cn/download/ 左边是稳定版,右边是最新版,安装自己想要的版本 安装到自己想要的路径下 一直next,这步不要勾选 然后install 在安装路径下创建两个文件夹,分别是node_cache和node_global 配置环境变量 再在系统path中添加%NODE_HOME%、%NODE_HOM…

安卓虚拟机的创建

在android studio上创建一个安卓虚拟机 可以选择手机型号 可选的都是谷歌的手机 而且对应的ui都是原生安卓ui 随便选就好 记得安卓版本不要太老,没必要虚拟机运行起来之后就会在边上有个视图

android studio的下载

进入android studio官网下载即可,中间所有东西点同意和next就行

Vue3--ref - reactive

reactive可以深层次对比ref定义对象类型是借用reactive总结