JavaScript Promise

在 JavaScript 中,Promise 是一种异步编程的解决方案,它代表一个在未来可能完成或失败的操作。Promise 可以帮助处理异步操作的回调地狱问题,并让代码更加清晰和易于维护。

1. Promise 的状态

每个 Promise 都有三种状态:

  1. Pending(进行中):初始状态,既没有完成也没有失败。
  2. Fulfilled(已成功):操作成功完成。
  3. Rejected(已失败):操作失败。

Promise 的状态从 Pending 变为 FulfilledRejected 后,这个状态就不再变化(即 Promise 是不可逆的)。

2. 创建一个 Promise

可以通过 new Promise 来创建一个新的 Promise 对象。构造函数接收一个 executor 函数,executor 函数有两个参数:

  • resolve:用于表示成功完成时的操作。
  • reject:用于表示失败时的操作。
const myPromise = new Promise((resolve, reject) => {const success = true; // 模拟异步操作结果if (success) {resolve("操作成功!");} else {reject("操作失败!");}
});

3. 使用 thencatch

  • then:当 Promise 成功时调用,接收一个处理结果的回调函数。
  • catch:当 Promise 失败时调用,接收一个处理错误的回调函数。
myPromise.then((result) => {console.log(result); // "操作成功!"}).catch((error) => {console.error(error); // "操作失败!"});

4. 使用 finally

finally 方法会在 Promise 结束时,无论成功或失败都会执行,可以用于清理资源或结束操作。

myPromise.then((result) => {console.log(result);}).catch((error) => {console.error(error);}).finally(() => {console.log("操作结束");});

5. Promise 链式调用

多个异步操作可以通过链式调用的方式依次执行。每个 then 返回一个新的 Promise,所以可以继续调用下一个 then

new Promise((resolve) => {resolve(1);
}).then((result) => {console.log(result); // 1return result + 1;}).then((result) => {console.log(result); // 2return result + 1;}).then((result) => {console.log(result); // 3});

6. Promise 静态方法

JavaScript 提供了一些 Promise 的静态方法来简化多个 Promise 的管理:

  1. Promise.all(iterable):接收一个 Promise 可迭代对象,等待所有 Promise 完成后返回一个包含所有结果的数组。如果有任意一个 Promise 失败,则返回失败的 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]
    });
    
  2. Promise.race(iterable):接收一个 Promise 可迭代对象,返回第一个完成的 Promise 的结果。

    const promise1 = new Promise((resolve) => setTimeout(resolve, 100, "第一个完成"));
    const promise2 = new Promise((resolve) => setTimeout(resolve, 200, "第二个完成"));Promise.race([promise1, promise2]).then((result) => {console.log(result); // "第一个完成"
    });
    
  3. Promise.allSettled(iterable):接收一个 Promise 可迭代对象,等待所有 Promise 完成,不论结果是成功还是失败,返回每个 Promise 的结果对象数组。

    const promise1 = Promise.resolve(1);
    const promise2 = Promise.reject("失败");Promise.allSettled([promise1, promise2]).then((results) => {console.log(results);/*[{ status: "fulfilled", value: 1 },{ status: "rejected", reason: "失败" }]*/
    });
    
  4. Promise.any(iterable):接收一个 Promise 可迭代对象,返回第一个成功的 Promise 的结果。如果所有 Promise 都失败,则返回 AggregateError

    const promise1 = Promise.reject("失败1");
    const promise2 = Promise.resolve("成功");
    const promise3 = Promise.reject("失败2");Promise.any([promise1, promise2, promise3]).then((result) => {console.log(result); // "成功"
    });
    

7. 实用示例

function fetchData(url) {return new Promise((resolve, reject) => {setTimeout(() => {// 模拟异步请求const data = { user: "Alice", age: 25 };if (data) {resolve(data);} else {reject("数据加载失败");}}, 1000);});
}fetchData("https://api.example.com/user").then((data) => {console.log("获取的数据:", data);}).catch((error) => {console.error("发生错误:", error);});

总结

  • Promise 是用于处理异步操作的对象。
  • then 处理成功,catch 处理失败,finally 在结束时执行。
  • Promise.allPromise.race 等静态方法提供了处理多个 Promise 的便捷方式。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

css:没错又是我

背景 给元素添加背景样式 还可以设置背景颜色、背景图片(教练我要学这个)、背景平铺、背景图片位置、背景图像固定 背景颜色 这个我们用过,就是: a {background-color: hotpink; } 一般默认值是transparent,也就…

adb 如何通过wifi连接手机

1. 电脑通过USB线连接手机 1.1手机开启开发者模式 以小米手机为例:连续点击OS版本系统(设置–>我的设备–>全部参数) 1.2在开发者模式下,启动允许USB安装与USB调试 操作步骤:设置>更多设置>开发者选项&g…

自己开发得期货资管模拟软件演示1.0.15版仅供学习

期货资管模拟软件演示1.0.15版仅供学习——C技术栈知识分享 本文将以期货资管模拟软件演示1.0.15版为例,分享其基于C技术栈的框架知识。 一、C技术栈在期货交易软件开发中的应用 C作为一种高性能的编程语言,以其强大的内存管理能力和高效的执行速度&a…

浅谈单片机的gcc优化级别__以双音频信号发生器为例

IDE: CLion HOST: Windows 11 MinGW:x86_64-14.2.0-release-posix-seh-ucrt-rt_v12-rev0 GCC: arm-gnu-toolchain-13.3.rel1-mingw-w64-i686-arm-none-eabi 一、简介 gcc有多种优化级别,一般不选择的情况下&#x…

C++之继承多态

C之继承&多态 继承继承之形继承的作用域继承的构造与析构多继承菱形继承 多态多态之形final和override(C11)纯虚函数&抽象类多态的原理打印虚表(在vs2022中)多继承下的虚表菱形虚继承中埋的坑静态多态与动态多态我对虚函数和普通成员函数调用区别…

机器学习-36-对ML的思考之机器学习研究的初衷及科学研究的期望

文章目录 1 机器学习最初的样子1.1 知识工程诞生(专家系统)1.2 知识工程高潮期1.3 专家系统的瓶颈(知识获取)1.4 机器学习研究的初衷2 科学研究对机器学习的期望2.1 面向科学研究的机器学习轮廓2.2 机器学习及其应用研讨会2.3 智能信息处理系列研讨会2.4 机器学习对科学研究的重…

arm 汇编技巧

汇编标号:f表示forward, b表示backward: Here is an example: 1: branch 1f 2: branch 1b 1: branch 2f 2: branch 1b Which is the equivalent of: label_1: branch label_3 label_2: branch label_1 label_3: branch label_4 label_4: bra…

特色3D打印stm32迷你8轴双核心主板

我自己设计的3D打印机主板 1. 这是一块迷你的8轴主板, 主板尺寸为100mm*75mm, 使用一个8cm静音风扇散热足够了2. 这是一个带有保护的板子, 驱动上的gpio具有过压保护功能, 能够直接抗住24V的冲击, 意味着一个驱动炸了, 板子不烧, 并且其他的驱动也没事, 主板支持自动关机3. 8…

golang分布式缓存项目 Day2 单机并发缓存

注:该项目原作者:https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习。 支持并发读写 接下来我们使用 sync.Mutex 封装 LRU 的几个方法,使之支持并发的读写。在这之…

2024 年将 Swagger 导入 Postman 图文教程

2024 年将 Swagger 导入 Postman 图文教程

从入门到精通:hello-algo开源项目助你系统学习数据结构与算法

文章目录 前言1.关于hello-algo2.安装Docker和Docker compose3.本地部署hello-algo4. hello-algo本地访问5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 本文将探讨如何在本地环境中部署hello-algo这一算法学习必备项目,并利用cp…

SystemVerilog学习笔记(七):函数与任务

函数 函数的主要用途是编写一段可以随时调用n次的代码,只需调用函数名即可,不需要任何模拟时间来执行。函数是返回类型,仅返回函数声明中提到的单个值,如果未声明则返回一个位的值。 语法: initial begin functio…

地下水数值模拟、 地下水环评、Visual modflow Flex、Modflow

地下水数值模拟软件Visual modflow Flex实践技术应用 地下水数值模拟软件的应用,主要围绕的目前应用较为广泛的Visual Modflow Flex 6.1软件版本开展,结合具体应用场景,实例讲解软件的全流程应用过程,包括数据处理分析、数值模型…

丹摩征文活动|Llama3.1:从安装到熟练使用的全方位教程

0.前言 目前关于 Llama 3.1 的详细安装和使用指南在网络上较为分散,对于许多想要深入了解和应用该模型的人来说,缺乏一个系统、全面的指导资料。为了填补这一空白,本文应运而生。旨在为广大读者提供从 Llama 3.1 的安装到熟练使用的全方位指…

UI自动化测试|CSS元素定位实践

前言 自动化测试元素定位是指在自动化测试过程中,通过特定的方法或策略来准确识别和定位页面上的元素,以便对这些元素进行进一步的操作或断言。这些元素可以是文本框、按钮、链接、图片等HTML页面上的任何可见或不可见的组件。 在自动化测试中&#xf…

软件架构与模式分析

软件架构模式分析 软件架构模式和架构风格是两个相关但不同的概念。 软件架构模式(Software Architecture Patterns)是一种在软件工程领域广泛应用的规范化、可复用的架构设计方案。它是通过抽象和提炼出解决特定问题所需的结构、组件、关系和规则等&am…

npm完整发包流程(亲测可验证)

1. 准备工作 (1) 在npm官网上注册一个账号 (2) 注册成功之后,npm会发送一封邮件给你,点击邮件里面的链接,做确认关联操作(必需) 2. 创建自己的npm包 (…

无插件直播流媒体音视频播放器EasyPlayer.js播放器多分屏超过6路不能播放如何解决

EasyPlayer.js H5播放器,是一款能够同时支持HTTP、HTTP-FLV、HLS(m3u8)、WS、WEBRTC、FMP4视频直播与视频点播等多种协议,支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式,支持MSE、WASM、WebCodec等多种解码方…

从零开始使用YOLOv11——Yolo检测detect数据集自建格式转换为模型训练格式:20w+图片1w+类别代码测试成功

在之前的文章中记录了YOLO环境的配置安装和基本命令的一些使用,上一篇博文的地址快速链接:从零开始使用YOLOv8——环境配置与极简指令(CLI)操作:1篇文章解决—直接使用:模型部署 and 自建数据集&#xff1a…

【HAProxy06】企业级反向代理HAProxy调度算法之其他算法

HAProxy 调度算法 HAProxy通过固定参数 balance 指明对后端服务器的调度算法,该参数可以配置在listen或backend选项中。 HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据不同的参数实现静态和动态算法 相互转换。 官方文档&#xff1…