【JavaScript】JavaScript Promises实践指南

news2025/4/25 7:43:07

【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优雅地处理可能在异步操作中发生的错误。拒绝的值可以是错误消息字符串、错误对象,或任何代表拒绝原因的其他值。

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

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

相关文章

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

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

为什么大模型在 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,用于…

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

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

机器学习——LightGBM

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

故障识别 | 基于改进螂优化算法(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输入上…

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

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

Yolo_v8的安装测试

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

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

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

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

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

从零到一:打造顶尖生成式AI应用的全流程实战

简介 生成式AI正以前所未有的速度改变我们的世界,从内容创作到智能客服,再到医疗诊断,它正在成为各行各业的核心驱动力。然而,构建一个高效、安全且负责任的生成式AI系统并非易事。本文将带你从零开始,逐步完成一个完整…

Windows 10更新失败解决方法

在我们使用 Windows 时的时候,很多时候遇到系统更新 重启之后却一直提示“我们无法完成更新,正在撤销更改” 这种情况非常烦人,但其实可以通过修改文件的方法解决,并且正常更新到最新版操作系统 01修改注册表 管理员身份运行注…

ubuntu24.04.2 NVIDIA GeForce RTX 4060笔记本安装驱动

https://www.nvidia.cn/drivers/details/242281/ 上面是下载地址 sudo chmod x NVIDIA-Linux-x86_64-570.133.07.run # 赋予执行权限把下载的驱动复制到家目录下,基本工具准备,如下 sudo apt update sudo apt install build-essential libglvnd-dev …

如何快速下载并安装 Postman?

从下载、安装、启动 Postman 这三个方面为大家详细讲解下载安装 Postman 每一步操作,帮助初学者快速上手。 Postman 下载及安装教程(2025最新)

1.1 计算机网络的概念

首先来看什么是计算机网络,关于计算机网络的定义并没有一个统一的标准,不同的教材有 不同的说法(这是王道书对于计算机网络的定义),我们可以结合自己的生活经验去体会这个 定义。 可以用不同类型的设备去连接计算机网络…

Blender绘图——旋转曲线(以LCP与RCP为例)

最近在做左旋圆偏振光(LCP)与右旋圆偏振光(RCP)的研究,因此需要画出他们的图,接下来我就介绍一下用Blender怎么去画LCP与RCP。 首先你需要下载Blender软件,网上直接能搜到,图标如下…

Spring与Mybatis整合

持久层整合 1.Spring框架为什么要与持久层技术进行整合 JavaEE开发需要持久层进行数据库的访问操作 JDBC Hibernate Mybatis进行持久层开发存在大量的代码冗余 Spring基于模板设计模式对于上述的持久层技术进行了封装 2.Mybatis整合 SqlSessionFactoryBean MapperScannerConfi…