关于 JavaScript 中的 Promises

news2025/8/6 10:08:12

在 JavaScript 中,Promise 是一个对象,它表示一个可能还不可用,但会在未来解决的值。Promises 用于处理异步操作,例如发出网络请求或访问数据库,其中结果不是立即可用的。

如果你准备好了,我想开始我们的冒险……


承诺如何运作?

APromise是创建承诺时不一定知道的值的代理。它允许您将处理程序与异步操作的最终成功值或失败原因相关联。这让异步方法像同步方法一样返回值:异步方法不是立即返回最终值,而是返回一个在未来某个时间点提供值的承诺。


Promise 具有三种可能的状态:

动图

  1. Pending: Promise 的初始状态。Promise 既未实现也未被拒绝。

  1. Fulfilled: Promise 已解决,结果值可用。

  1. Rejected: Promise 已被拒绝并发生错误。


一旦 Promise 被解决,它就不能被重新设置。or函数只能调用一次,以后对这些函数的任何调用都不会产生任何效果resolve()reject()已解决的 Promise 的不变性是一个重要的特性,因为它确保 Promise 的值保持一致和可预测。一旦 Promise 被解决,它的值就不能改变,这有助于防止意外行为并使代码更容易推理。


如何创建承诺?

Promise 是使用Promise构造函数创建的,它接受一个参数,一个称为executor 的函数。executor 函数有两个参数:resolvereject。这些是在 Promise 被fulfilledrejected时调用的函数。

告诉你我的意思..

上面示例中的 Promise 将在一秒后 resolve,并且 resolved Promise 的值将是 users 数组。

创建 Promise 后,您可以使用该then方法附加一个回调函数,该回调函数将在 Promise 完成时调用。该then方法有两个参数:解析值的回调函数和拒绝值的回调函数。

告诉你我的意思..


继续我们的冒险,让我们看一个被拒绝的 Promise 的例子。

告诉你我的意思..


链式承诺

以下方法用于将进一步的操作与已确定的承诺相关联。由于这些方法返回承诺,因此可以将它们链接起来

Promise.prototype.then()
Promise.prototype.catch()
Promise.prototype.finally()

动图

在 JavaScript 中链接 promise 涉及创建一系列依次执行的 promise。链中的每个承诺都取决于前一个承诺的成功完成,因此如果链中的任何承诺失败,则整个链都会失败。

让我们看看如何在 JavaScript 中链接承诺:

在这里,该fetchData()函数用于从远程 API 获取数据并对其执行一些操作。该fetchData()函数返回一个使用操作结果解析的 Promise。

Promise 链首先从 API 获取用户数据,然后使用第一个用户的 ID 获取他们的帖子,最后使用第一个帖子的 ID 获取该帖子的评论。链中的每个then()方法都处理前一个 Promise 的解析值,最后一个catch()方法处理链中发生的任何错误。

then()我们可以根据要求使用方法创建许多链。与同步代码一样,链接将产生一个串行运行的序列。让我们看一个简单的例子..


承诺的好处

在处理 JavaScript 中的异步操作时,Promises 比传统的基于回调的方法有几个好处。一些主要好处包括:

  1. 更好的可读性:与传统的基于回调的方法相比,Promises 允许您编写更具可读性和更易于理解的代码。使用 Promises,您可以按顺序将异步操作链接在一起,这使得操作的执行顺序一目了然。

  1. 改进的错误处理: Promises 使处理异步操作期间发生的错误变得更加容易。使用 Promises,您可以使用 catch 方法来处理链中任何步骤中发生的错误,而不必为每个步骤单独处理错误。

  1. 避免回调地狱: Promises 可以帮助您避免“回调地狱”,即您拥有一连串嵌套的回调,这会变得难以管理和调试。使用 Promises,您可以将异步操作链接在一起,而无需嵌套多个级别的回调。

  1. 返回值的能力: Promises 允许您从异步操作返回一个值,这使得将一个操作的结果按顺序传递给另一个操作变得更加容易。当您需要按顺序执行多个异步操作并且需要在下一个操作中使用每个操作的结果时,这尤其有用。

  1. 更好的兼容性: Promises 是现代 JavaScript 中的标准化功能,并且受到所有现代浏览器和 Node.js 的支持。这意味着 Promises 可以在不同的环境中使用,而不需要为每个环境使用不同的代码。


如何取消承诺?

在现代 JavaScript 中——不,Promise 一旦创建就无法取消。它将执行其代码并解决或拒绝,并且没有内置的方式来取消操作。

您可以使用一些技术来模拟取消:

  1. 超时:如果解决时间太长,您可以使用超时来拒绝 Promise。如果您正在发出网络请求并希望限制所花费的时间,则此技术很有用。

  1. 中止网络请求:您可以使用中止控制器来中止网络请求。Fetch API 提供了一个 AbortController API,允许您在网络请求完成之前取消它。

  1. 使用标志:您可以在代码中使用标志来模拟取消。您可以将标志设置为 true 以指示应取消该操作,然后检查您的 Promise 代码中的标志以确定是继续还是拒绝 Promise。

值得注意的是,这些技术都没有真正取消 Promise;他们只是提早拒绝它。如果您需要真正的取消,您可能需要使用提供取消支持的库,例如rxjsbluebird


蓝鸟承诺取消

Bluebird是一个流行的 JavaScript Promise 库,它提供高级功能,包括 Promise 取消。Promise 取消是取消 Promise 的能力,这对于取消正在进行的或长时间运行的异步操作很有用。

在Bluebird的帮助下,使用该Promise.cancel()方法实现了Promise取消。此方法不是标准 Promise API 的一部分,并且特定于 Bluebird。

要在 Bluebird 中使用 Promise 取消,您需要使用new Promise()构造函数创建一个可取消的 Promise 并将取消函数作为参数传递。当 Promise 被取消时,将调用 cancel 函数。


并行的多个承诺

在Promises的帮助下,可以更轻松地并行管理和执行多个异步操作,并等待所有操作完成后再继续。

告诉你我的意思..

使用语法创建四个承诺new Promise()。每个承诺在使用方法的特定超时期限后被解决拒绝setTimeout()。该error函数被定义为将任何错误记录到控制台。

创建上述承诺后,现在我们将看到使用不同承诺方法的实例。

Promise.all() 方法

下面的实例使用Promise.all()方法,该方法接受一组承诺并等待所有承诺得到履行。一旦所有的 promise 都得到解决,then()就会执行方法,该方法按照它们在 promise 数组中传递的顺序返回一个值数组。在这种情况下,所有三个承诺都已解决,并且它们的值被记录到控制台。

这是一个很好的方法,例如使用两个不同的请求获取数据,然后在两个请求完成后将它们组合起来。

Promise.any() 方法

下面的实例使用的Promise.any()方法接受一组承诺并等待其中任何一个被履行。一旦第一个承诺得到解决,then()就会执行返回第一个承诺的已解决值的方法。在这种情况下,第三个承诺在其他两个之前得到解决,并且它的值被记录到控制台。

Promise.race() 方法

下面的实例使用的Promise.race()方法接受一组承诺并等待第一个承诺被解决或拒绝。一旦第一个承诺被解决,then()方法就会被执行,它返回第一个已解决承诺的已解决或被拒绝的值。在这种情况下,第三个承诺在其他两个之前得到解决,因此它的值被记录到控制台。

Promise.allSettled() 方法

下面的实例使用的Promise.allSettled()方法接受一组承诺并等待所有承诺得到解决,即 resolved 或 rejected。一旦所有的承诺都得到解决,then()就会执行返回一个对象数组的方法,每个对象包含每个承诺的状态价值原因。在这种情况下,所有承诺都已解决,因此所有承诺的状态和值或原因都记录到控制台。


结论

Fetch API 是旧 XMLHttpRequest 对象的现代替代品,它基于 Promises。当您使用 Fetch API 发出请求时,您会得到一个解析为响应对象的 Promise。这允许您使用该then()方法以清晰易读的方式处理响应。

异步函数是 JavaScript 的新成员,它们构建在 Promises 之上。异步函数允许您编写看起来像同步代码的异步代码,使其更易于阅读和编写。异步函数使用 await 关键字等待 Promises 在继续之前解析,从而可以编写看起来像一系列同步语句的异步代码。

在这两种习惯用法中,Promises 都用于以清晰易读的方式处理异步操作。通过使用 Promises,您可以避免回调地狱并编写易于推理的异步代码。


动机

提醒:
无论别人怎么说和怎么想,你都是很棒的..

🍀支持

请考虑通过订阅我们的频道来关注和支持我们。非常感谢您的支持,这将帮助我们继续创作供您欣赏的内容。预先感谢您对我们的支持!

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

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

相关文章

基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇

本文目录前言做项目的三大好处强强联手(天狗组合)专栏作者简介专栏的优势后端规划1. SpringBoot 和 SpringCloud 的选择2. Mybatis 和 MybatisPlus 和 JPA 的选择3. MySQL 和 Mongodb 的选择4. Redis 和 RocketMQ5. 后端规划小总结后端大纲提前掌握的知识点一期SpringBoot二期S…

EventLoop机制

JavaScript 是单线程的语言 JavaScript 是一门单线程执行的编程语言。也就是说,同一时间只能做一件事情。 单线程执行任务队列的问题: 如果前一个任务非常耗时,则后续的任务就不得不一直等待,从而导致程序假死的问题。 同步任…

机器学习和深度学习的综述

机器学习和深度学习的综述 1.1.1人工智能、机器学习、深度学习的关系 人工智能(Artificial Intelligence,AI)是最宽泛的概念,是研发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。由于这个定义…

代码随想录算法训练营第二十一天打卡 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

打卡第21天,继续二叉树,前几天终于补完了,感觉难度上来了。 今日任务 530.二叉搜索树的最小绝对差501.二叉搜索树中的众数 二叉树的最近公共祖先 530.二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root ,返回 树中任意两不…

计算机网络——路由、交换、子网篇

子网掩码 解释1 作者:纪言 链接:https://www.zhihu.com/question/56895036/answer/447915532 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 仅限ip4首先子网掩码这名字取得很好&#xff0c…

Java创建线程的方式只有一种:Thread+Runnable

Java创建线程的方式其实只有一种👨‍🎓一、继承Thread👨‍🎓二、实现Runnable接口👨‍🎓三、实现Callable接口👨‍🎓四、通过线程池创建👨‍🎓五、总结一般我…

SOLID 原则要这么理解!

什么是 SOLID 原则 SOLID 原则其实是用来指导软件设计的,它一共分为五条设计原则,分别是: 单一职责原则(SRP)开闭原则(OCP)里氏替换原则(LSP)接口隔离原则(…

Matter 系列 #9|乐鑫 Matter 预配置服务加速设备生产

乐鑫 Matter 系列文章 #9 目录 Matter 预配置服务 1. 设备认证 (Device Attestation) 2. 独特性 (Uniqueness) 3. 安全性 (Security) 联系我们​​​​​​​ 如今,物联网行业蓬勃发展,大量市场参与者正在积极地构建 Matter 智能设备。 乐鑫一直致…

盲盒开发:多元化设计、数字化销售、可持续发展

随着互联网的发展,盲盒成为了一种新型文化现象和玩具消费方式。它不仅满足了人们的消费需求,也引发了人们对玩具和收藏品的热爱和追求。目前,盲盒市场已经逐渐发展成为一个庞大的产业,其中海外盲盒市场更是异彩纷呈,备…

Git安装初始化及Gitee上传提交步骤

一、git安装git下载https://git-scm.com/download/win直接点击下一步“next”安装即可在桌面右键,选择 Git Bash Here 在 Git Bash Here 终端里输入 git --version 查看 git 版本,如图所示,说明 Git 安装成功。在终端设置用户签名邮箱git con…

windows7安装sql server 2000安装步骤 及安装过程中遇到的问题和解决方式

提示:文章写完后windows7安装sql server 2000安装步骤 及安装过程中遇到的问题和解决方式, 文章目录一、ms sql server 2000是什么?版本简介:**特点:****优点:**二、步骤1.下载安装包及Sq4补丁包2.安装 ms …

淘宝 APP 网络架构演进与弱网破障实践

作者:沈良炜 阿里大淘宝终端体验平台团队 面对移动互联网络下复杂多变的网络环境,如何提供更稳定可靠的请求性能,保障用户的加载浏览体验?本文将为大家分享淘宝APP统一网络库的演进。 一、引言 自2013年ALLIN无线到今天&#xff0…

ESP32设备驱动-土壤湿度传感器驱动

土壤湿度传感器驱动 1、土壤湿度传感器介绍 土壤湿度传感器由两个探头组成,用于测量水的体积含量。 两个探头让电流通过土壤,然后得到电阻值来测量水分值。 当有更多的水时,土壤会传导更多的电,这意味着电阻会更小。 因此,水分含量会更高。 干燥的土壤导电性差,所以当…

第八章.贝叶斯分析—贝叶斯定理朴素贝叶斯

第八章.贝叶斯分析 8.1 贝叶斯定理&朴素贝叶斯 贝叶斯主要应用与新闻分类,文本分类,评论分析。 1.数理统计学处理的信息 1).贝叶斯方法 关于统计推断的系统理论和方法,称为贝叶斯方法。 2).经典统计学 总体信息:当前总体样…

【2223sW2】LOG2

写在前面 好好学习,走出宿舍,走向毕设! 一些心路历程记录,很少有代码出现 因为鬼知道哪条代码到时候变成毕设的一部分了咧,还是不要给自己的查重挖坑罢了 23.3.2 检验FFT 早上师兄帮忙看了一眼我画的丑图&#xff…

什么是模块,Python模块化编程(入门必读)

Python 提供了强大的模块支持,主要体现在,不仅 Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块。通过这些强大的模块可以极大地提高开发者的开发效率…

深入理解Mysql索引底层数据结构与算法

索引是帮助MySQL高效获取数据的排好序的数据结构 深入理解Mysql索引底层数据结构与算法1.常见的数据结构讲解1.1 二叉树1.1.1 二叉树的定义1.1.2 二叉树示例1.1.3 Mysql为什么不使用二叉树进行数据存储1.2 红黑树1.2.1 红黑树的定义1.2.2 红黑树示例1.2.3 Mysql 为什么不适用红…

k8s学习之路 | k8s 工作负载 ReplicaSet

文章目录1. ReplicaSet 基础概念1.1 RS 是什么?1.2 RS 工作原理1.3 什么时候使用 RS1.4 RS 示例1.5 非模板 Pod 的获得1.6 编写 RS1.7 使用 RS1.8 RS 替代方案2. ReplicaSet 与 ReplicationController2.1 关于 RS、RC2.2 两者的选择器区别2.3 总结1. ReplicaSet 基础…

【三维几何学习】使用VTK对网格输入特征进行可视化

使用VTK对网格输入特征进行可视化引言一、全部代码二、可视化引言 使用python调用VTK库对网格的输入特征进行可视化,方便后续实验与分析 上图可视化的输入特征是热核特征HKS的第一个通道,也可对其他输入进行可视化数据集可参考1:三角网格(Triangular Me…

网上鲜花交易平台,可运行

文章目录项目介绍一、项目功能介绍1、用户模块主要功能包括:2、商家模块主要功能包括:3、管理员模块主要功能包括:二、部分页面展示1、用户模块部分功能页面展示2、商家模块部分功能页面展示3、管理员模块部分功能页面展示三、部分源码四、底…