当前位置: 首页 > article >正文

【JavaScript】JavaScript Promises实践指南

【JavaScript】JavaScript Promises实践指南

在这里插入图片描述

你了解JavaScript中的Promises吗?这是一个很多人一开始就放弃的主题,但我会尽量让它变得尽可能简单。

1. “Promise”到底是什么?

“Promise”是异步编程中的一个基本概念,特别是在JavaScript和许多现代编程语言中。它代表一个可能尚未可用但将在未来某个时刻解决的值(或操作的结果), either successfully with a value or unsuccessfully with an error.

2. Promise的状态:

在JavaScript中,Promise可以处于以下三种状态之一:

  1. Pending(进行中): 这是Promise创建时的初始状态。它表示由Promise代表的异步操作尚未完成,结果(履行或拒绝)不可用。Promises从这种状态开始,然后过渡到其他状态之一。
  2. Fulfilled(履行): 这个状态表示异步操作成功完成。当Promise过渡到履行状态时,意味着操作已成功完成,结果(值或数据)可用。您可以使用.then()方法访问解决的值。
  3. Rejected(拒绝): 这个状态表示异步操作失败。当Promise过渡到拒绝状态时,意味着操作过程中发生了错误或异常。您可以使用.catch()方法或.then()方法的第二个参数访问拒绝的原因(错误对象或消息)并处理它。

以下是Promise状态和转换的直观表示:

初始状态:         进行中/           \   
履行状态:       履行          拒绝(结果可用)    (发生错误)

Promises的设计旨在提供一种结构化的方式来处理异步操作,允许您分别处理成功和失败情况。您可以使用.then()指定Promise履行时要做的事情,使用.catch()处理Promise拒绝时的错误。这使异步代码比基于回调的方法更易于管理和阅读。

3. 如何构建一个Promise

在JavaScript中构建Promise,可以使用Promise构造函数,它接受一个单一函数作为参数。这个函数被称为执行器函数,它有两个参数:resolverejectresolve函数用于用值履行Promise,reject函数用于用错误拒绝Promise。

以下是创建Promise的基本结构:

const myPromise = new Promise((resolve, reject) => {// 异步或耗时操作在这里进行// 通常,您会执行一些异步任务,比如获取数据或读取文件// 如果操作成功,调用resolve并传入结果// resolve(result);// 如果发生错误,调用reject并传入错误对象或消息// reject(error);
});

以下是一个更具体的示例,使用setTimeout模拟延迟的异步操作,并在一定时间后解决Promise:

const delay = (milliseconds) => {return new Promise((resolve, reject) => {setTimeout(() => {resolve(`${milliseconds}毫秒后解决`);}, milliseconds);});
};// 使用:
delay(2000) // 等待2秒.then((result) => {console.log(result); // 在2000毫秒后解决}).catch((error) => {console.error(error);});

在这个示例中:

  1. 我们定义了一个返回Promise的函数delay。在Promise构造函数内部,我们使用setTimeout模拟异步延迟。
  2. 如果异步操作成功(即setTimeout完成),我们调用resolve并传入结果。
  3. 如果操作过程中发生错误,我们可以调用reject并传入错误对象或消息。
  4. 我们使用.then()指定Promise履行(解决)时要做的事情,使用.catch()处理可能发生的任何错误。

这是一个简单的示例,但在实践中,您会用真实的异步操作(如发起API请求或读取文件)替换setTimeout。Promises提供了一种结构化的方式来处理异步代码,使其更易于阅读和维护。

3.1. Promise解决时返回值

在JavaScript Promises中,您可以通过在Promise的执行器函数内将解决的值作为参数提供给resolve函数来在Promise解决时返回值。以下是操作方法:

const myPromise = new Promise((resolve, reject) => {// 模拟成功的异步操作setTimeout(() => {const result = '这是解决的值';resolve(result); // 用结果解决Promise}, 2000);
});// 使用Promise来访问解决的值
myPromise.then((result) => {console.log('解决:', result); // 解决: 这是解决的值}).catch((error) => {console.error('错误:', error);});

在这个例子中:

  1. 在Promise的执行器函数内部,我们使用setTimeout模拟异步操作。
  2. 当异步操作成功完成时,我们调用resolve(result)并传入期望的解决值(在这个例子中是'这是解决的值')。
  3. 当你使用.then()来处理Promise的解决时,解决的值作为参数传递给回调函数。你可以在那个回调函数内访问和使用解决的值。

result变量包含解决的值,你可以在.then()回调中根据需要使用它。

这种模式允许你以结构化和清晰的方式处理异步操作的结果。解决的值可以是任何数据类型,包括字符串、数字、对象,甚至是其他Promise。

3.2. Promise被拒绝时返回错误

在JavaScript Promises中,你可以通过在Promise的执行器函数内将错误消息或错误对象作为参数提供给reject函数来在Promise被拒绝时返回错误。以下是操作方法:

const myPromise = new Promise((resolve, reject) => {// 模拟失败的异步操作setTimeout(() => {const errorMessage = '这是错误消息';reject(errorMessage); // 用错误消息拒绝Promise}, 2000);
});// 使用Promise来处理拒绝和错误
myPromise.then((result) => {console.log('解决:', result);}).catch((error) => {console.error('错误:', error); // 错误: 这是错误消息});

在这个例子中:

  1. 在Promise的执行器函数内部,我们使用setTimeout模拟失败的异步操作。
  2. 当异步操作遇到错误时,我们调用reject(errorMessage)并传入期望的错误消息(在这个例子中是'这是错误消息')。
  3. 当你使用.catch()来处理Promise的拒绝时,拒绝的错误作为参数传递给回调函数。你可以在那个回调函数内访问和使用错误消息或错误对象。

error变量包含拒绝的错误,你可以根据需要处理和记录它,或执行任何其他错误处理任务。

这种模式允许你使用Promises优雅地处理可能在异步操作中发生的错误。拒绝的值可以是错误消息字符串、错误对象,或任何代表拒绝原因的其他值。

相关文章:

【JavaScript】JavaScript Promises实践指南

【JavaScript】JavaScript Promises实践指南 你了解JavaScript中的Promises吗?这是一个很多人一开始就放弃的主题,但我会尽量让它变得尽可能简单。 1. “Promise”到底是什么? “Promise”是异步编程中的一个基本概念,特别是在J…...

【软件工程】习题及答案

目录 第一章 习题第一章 习题答案第二章 习题第二章 习题答案第三章 习题第三章 习题答案第四章 习题第四章 习题答案第五章 习题第五章 习题答案第六章 习题第六章 习题答案第七章 习题第七章 习题答案 第一章 习题 一、选择题 1.关于引起软件危机的原因&#xff…...

git push的时候出现无法访问的解决

fatal: 无法访问 https://github.com/...:gnutls_handshake() failed: Error in the pull function. push的时候没有输入自己的github账号密码,为了解决每次push都要登录github这个问题,采用ssh密钥的方式认证,可以免去每次都输入…...

《深度剖析Android 12 SystemUI锁屏通知布局亮屏流程:从源码到实现》

优化后文章结构: 1. 前言 强调锁屏通知布局的重要性及分析目的,引出后续源码分析的必要性。 2. 核心类解析 KeyguardViewMediator:锁屏核心逻辑控制,处理亮屏/息屏事件分发。 PhoneWindowManager:系统输入事件&…...

为什么大模型在 OCR 任务上表现不佳?

编者按: 你是否曾经用最先进的大语言模型处理企业文档,却发现它把财务报表中的“$1,234.56”读成了“123456”?或者在处理医疗记录时,将“0.5mg”误读为“5mg”?对于依赖数据准确性的运营和采购团队来说,这…...

HCIP(VLAN综合实验)

实验拓补图 实验分析 一、实验目的 掌握VLAN的创建和配置方法理解VLAN在局域网中的作用学习如何通过VLAN实现网络隔离和通信 二、实验环境 交换机(SW1、SW2、SW3)个人电脑(PC1、PC2、PC3、PC4、PC5、PC6)路由器(R1…...

每日算法-250328

记录今天学习和解决的LeetCode算法题。 92. 反转链表 II 题目 思路 本题要求反转链表中从 left 到 right 位置的节点。我们可以采用 头插法 的思路来反转指定区间的链表。 具体来说,我们首先定位到 left 位置节点的前一个节点 prev。然后,从 left 位置…...

从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换

从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换 前言一、环境准备二、核心代码实现1. 将 Word 转换为 HTML 文件流2. 优化超链接样式 三、测试效果四、总结 前言 在日常开发中,我们经常需要将 Word 文档转换为 HTML,用于…...

Android 设备实现 adb connect 连接的步骤

1. 检查设备的开发者选项 确保平板设备已开启开发者模式,并启用了USB调试。 2. 检查设备和电脑的网络连接 确保平板和电脑连接到同一个Wi-Fi网络,确认设备的 IP 地址是否正确。 通过 ping 命令测试: ping 192.168.3.243. 通过USB线进行初…...

【人工智能】解锁大模型潜力:Ollama 与 DeepSeek 的分布式推理与集群部署实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的快速发展,其推理能力在自然语言处理、代码生成等领域展现出巨大潜力。然而,单机部署难以满足高并发、低延迟的需…...

离散的数据及参数适合用什么算法做模型

离散数据和参数适用的机器学习算法取决于具体任务(分类、回归、聚类等)、数据特点(稀疏性、类别数量等)以及业务需求。以下是针对离散数据的常用算法分类和选择建议: 1. 分类任务(离散目标变量) 经典算法 决策树(ID3/C4.5/CART) 直接处理离散特征,无需编码,可解释性…...

VMware 安装 Ubuntu 实战分享

VMware 安装 Ubuntu 实战分享 VMware 是一款强大的虚拟机软件,广泛用于多操作系统环境的搭建。本文将详细介绍如何在 VMware 中安装 Ubuntu,并分享安装过程中的常见问题及解决方法。 1. 安装前的准备工作 (1) 系统要求 主机操作系统:Windo…...

RSA 简介及 C# 和 js 实现【加密知多少系列_4】

〇、简介 谈及 RSA 加密算法,我们就需要先了解下这两个专业名词,对称加密和非对称加密。 对称加密:在同一密钥的加持下,发送方将未加密的原文,通过算法加密成密文;相对的接收方通过算法将密文解密出来原文…...

在IDEA中快速注释所有console.log

在IDEA中快速注释所有console.log 在前端IDEA中,快速注释所有console.log语句可以通过以下步骤实现2: 打开要修改的文件。使用快捷键CtrlF打开搜索框。点击打开使用正则搜索的开关或者通过AltR快捷键来打开。在搜索框输入[]*console.log[]*,…...

GPT-4o图像生成功能:技术突破与隐忧并存

2025年3月25日,OpenAI正式推出GPT-4o原生图像生成功能,宣称其实现了“文本到图像的终极跨越”。然而,这一被市场追捧的技术在短短72小时内便因用户需求过载触发限流,暴露出算力瓶颈与商业化矛盾的尖锐性。这场技术狂欢的背后&…...

SQL语言分类及命令详解(二)

目录 一、DQL (Data Query Language) 数据查询语言 核心命令:SELECT 基本语法: 详细分析: 高级特性: 示例: 二、DDL (Data Definition Language) 数据定义语言 核心命令 CREATE ALTER DROP TRUNCATE 详细…...

机器学习——LightGBM

LightGBM(light gradient boosting machine,轻量梯度提升机)是对XGBoost进行改进的模型版本,其三者之间的演变关系为:GBDT-》XGBoost-》LightGBM,依次对性能进行优化,尽管XGBoost已经很高效了,但是仍然有缺…...

linux 常见命令使用介绍

Linux 常见命令使用介绍 Linux 是一个功能强大的操作系统,其核心是命令行工具。掌握一些常用的 Linux 命令可以极大地提高工作效率。本文将详细介绍一些常见的 Linux 命令及其用法。 1. 文件与目录操作 ls - 列出文件和目录 # 查看当前目录下的所有文件和子目录&…...

故障识别 | 基于改进螂优化算法(MSADBO)优化变分模态提取(VME)结合稀疏最大谐波噪声比解卷积(SMHD)进行故障诊断识别,matlab代码

基于改进螂优化算法(MSADBO)优化变分模态提取(VME)结合稀疏最大谐波噪声比解卷积(SMHD)进行故障诊断识别 一、引言 1.1 机械故障诊断的背景和意义 在工业生产的宏大画卷中,机械设备的稳定运行…...

[已解决]服务器CPU突然飙高98%----Java程序OOM问题 (2024.9.5)

目录 问题描述问题排查问题解决参考资料 问题描述 业主单位服务器自8月29日晚上21:00起CPU突然飙高至98%,内存爆满,一直到9月5日: 问题排查 ①执行 top 命令查看Java进程PID top②执行top -Hp PID 命令查看具体的线程情况 top -Hp 3058输入上…...

spring如何用三级缓存解决循环依赖问题

spring为何会出现循环依赖问题? 我们举个会产生循环依赖的例子,如下所示,可以看到AService类中依赖了BService类,同理呢,BService类中依赖了AService类,这就是所谓的循环依赖。 Component("aService&…...

【C#】`Task.Factory.StartNew` 和 `Task.Run` 区别

Task.Factory.StartNew 和 Task.Run 都是用来启动新任务的,但它们有一些关键区别,我们来一条一条讲清楚(配例子 结论)。 🆚 1. 语法和使用目的 对比项Task.RunTask.Factory.StartNew用途简化写法,用于启动…...

谈谈空间复杂度考量,特别是递归调用栈空间消耗?

空间复杂度考量是算法设计的核心要素之一,递归调用栈的消耗问题在前端领域尤为突出。 以下结合真实开发场景进行深度解析: 一、递归调用栈的典型问题 1. 深层次DOM遍历的陷阱 // 危险操作:递归遍历未知层级的DOM树 function countDOMNode…...

【2.项目管理】2.4 Gannt图【甘特图】

甘特图(Gantt)深度解析与实践指南 📊 一、甘特图基础模板 项目进度表示例 工作编号工作名称持续时间(月)项目进度(周)1需求分析3▓▓▓░░░░░░░2设计建模3░▓▓▓░░░░░░3编码开发3.5░░░▓▓▓▓░░…...

Ai工作流工具有那些如Dify、coze扣子等以及他们是否开源

Dify (https://difycloud.com/) 核心定位:专业级 LLM 应用开发平台,支持复杂 AI 工作流构建与企业级管理。典型场景:企业智能客服、数据分析系统、复杂自动化流程构建等。适合需要深度定制、企业级管理和复杂 AI 逻辑…...

【项目】C++同步异步日志系统-包含运行教程

文章目录 项目介绍地址:https://gitee.com/royal-never-give-up/c-log-system 开发环境核心技术为什么需要日志系统同步日志异步日志 知识补充不定参宏函数__FILE____LINE____VA_ARGS__ C使用C使用左值右值sizeof...() 运算符完美转发完整例子sizeof...() 运算符获取…...

Yolo_v8的安装测试

前言 如何安装Python版本的Yolo,有一段时间不用了,Yolo的版本也在不断地发展,所以重新安装了运行了一下,记录了下来,供参考。 一、搭建环境 1.1、创建Pycharm工程 首先创建好一个空白的工程,如下图&…...

Success is the sum of small efforts repeated day in and day out.

(翻译:"成功是日复一日微小努力的总和。") 文章内容: Title: The Silent Power of Consistency (标题翻译:《持续坚持的无声力量》) Consistency is the quiet force that turns asp…...

软件兼容性测试的矩阵爆炸问题有哪些解决方案

解决软件兼容性测试中的矩阵爆炸问题主要有优先级划分、组合测试方法、自动化测试技术等方案。其中,组合测试方法尤其有效。组合测试通过科学的组合算法,能够显著降低测试用例的数量,同时保持较高的测试覆盖率,例如正交实验设计&a…...

嵌入式学习(32)-TTS语音模块SYN6288

一、概述 SYN6288 中文语音合成芯片是北京宇音天下科技有限公司于 2010年初推出的一款性/价比更高,效果更自然的一款中高端语音合成芯片。SYN6288 通过异步串口(UART)通讯方式,接收待合成的文本数据,实现文本到语音(或 TTS 语音)的转换。宇音天下于 2002…...