你为什么还在用Promise.all?

news2024/11/20 3:35:26

请停止在JavaScript中使用Promise.all()

什么是JavaScript中的Promise

如果您偶然发现这篇文章,那么您可能已经熟悉了promise。 但是,对于那些JavaScript新手来说,让我们来详细说明一下。 从本质上讲,Promise对象表示异步操作的最终完成或失败。 有趣的是,当创建promise时,其值可能无法立即可用。

const promise = new Promise((resolve, reject) => {
  // Some asynchronous operation
  if (/* operation is successful */) {
    resolve(result);
  } else {
    reject(error);
  } 
});

它们有3种状态:

  • Pending:这是初始状态,既未实现也未拒绝
  • Fulfilled:当promise成功完成并导致值时的状态
  • Rejected:在promise执行期间发生错误时的状态

一旦promise已确定,您可以使用.then()来处理结果和.catch()来管理执行期间出现的任何错误。

promise
  .then(result => {
    console.log(‘Success:’, result);
  }) 
  .catch(error => {
    console.error(‘Error:’, error);
  });

理解Promise.all()

在同时处理多个promise时,您可以利用内置的Promise.all([])方法。 此方法接受一个promise数组并返回一个统一的promise。 关键的是,这个组合的promise只有在所有输入的promise都成功解析时才会解析。 如果即使一个失败,整个promise也会拒绝。 这里有一个例子:

const promise1 = fetch(‘https://api.example.com/data1');   
const promise2 = fetch(‘https://api.example.com/data2');
const promise3 = fetch(‘https://api.example.com/data3');

Promise.all([promise1, promise2, promise3])
  .then(values => {
    console.log(‘All data fetched:’, values);
  })
  .catch(error => {
    console.error(‘An error occurred:’, error);
  }); 

当有多个相关的异步任务以及它们的工作相互依赖时,通常会使用此方法,因此我们希望它们都成功才能继续代码执行。

揭示Promise.allSettled()

使用Promise.allSettled([])类似于使用Promise.all([]),不同之处在于它将等待所有输入promise要么兑现要么拒绝,并返回描述每个promise结果的对象数组。

const promise1 = Promise.resolve(‘Success 1’); 
const promise2 = Promise.reject(‘Error 2’);
const promise3 = Promise.resolve(‘Success 3’);  

Promise.allSettled([promise1, promise2, promise3])
  .then(results => {
    results.forEach(result => {
      if(result.status === ‘fulfilled’) {
        console.log(‘Fulfilled with value:’, result.value);
      } else {
        console.error(‘Rejected with reason:’, result.reason);
      }
    });
 });  

//结果  
// Fulfilled with value: Success 1
// Rejected with reason: Error 2 
// Fulfilled with value: Success 3

它通常用于处理不依赖于彼此的异步操作,并且您希望知道每个操作的结果。

为什么Promise.allSettled()更加出色

总的来说,在大多数常见情况下,使用Promise.allSettled()而不是Promise.all()具有其优势:

全面的结果信息

如果任何promise被拒绝,Promise.all()会立即被拒绝,这使得确定其他promise的状态变得困难,特别是在其他promise成功解析的同时。 使用Promise.allSettled([])可以给你一个完整的结果图片。

优雅的错误处理

当您希望无论失败与否都继续执行时,Promise.all()的“快速失败”方法可能会受到限制,而Promise.allSettled()允许您单独处理每个promise的结果。

批量操作

在处理批量操作的同时单个操作是独立的,您可能不希望整个批处理由于操作失败而失败。

更明智的决策

使用Promise.allSettled()后,在访问所有promise的结果后,您可以做出更明智的决定。 例如,当您从不同的API获取数据时,如果其中一个失败,您可以决定是否应该继续处理数据或提供带有错误消息的通知。

增强的用户体验

如果必要,提供部分结果和错误通知通常比仅使用一些通用消息失败整个操作的UX要好。 Promise.allSettled()使这种方法很容易实现。

最后的话

总之,在某些情况下,Promise.all()可能很有价值,但Promise.allSettled()为大多数场景提供了更灵活、更具弹性的方法。

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

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

相关文章

书生·浦语第三次作业

我最近在参加书生浦语大模型实战营,这是第三次作业打卡! 如果你也想两周玩转大模型微调,部署与测评全链路。报名链接:invite 书生浦语大模型实战营报名 邀请码可以填026014 一、基础作业:复现课程知识库助手搭建过程…

Vercel配置自定义域名

首先你需要有一个域名 1.点击部署的项目设置 2.找到Domains 3.输入自己的域名 点击添加之后按要求去域名服务商添加解析即可 4.显示下面内容就设置完成了,

[NOIP2006 提高组] 作业调度方案(修改)

题目: 这里对于之前的题目进行修改记录。果然还是受不了等待,利用晚饭时间又看了这个题目。于是发现了问题。 之前的博客:https://blog.csdn.net/KLSZM/article/details/135522867?spm1001.2014.3001.5501 问题修改描述 上午书写的代码中是…

Vue新手村(二)

目录 1、计算属性 2、事件修饰符 2.1、stop事件修饰符 2.2、prevent事件修饰符 2.3、self事件修饰符 2.4、once事件修饰符 3、按键修饰符 3.1、enter回车键 1、计算属性 计算属性: computed:vue官方提供一个计算属性作用:在完成某种业…

【AI视野·今日NLP 自然语言处理论文速览 第七十三期】Tue, 9 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 9 Jan 2024 Totally 80 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers FFSplit: Split Feed-Forward Network For Optimizing Accuracy-Efficiency Trade-off in Language Model Infe…

浏览器输入一个域名的解析过程

目录 从输入一个域名的解析过程 以www.baidu.com为例子 本地缓存和hosts文件 mDNS和LLMNR NBT-NS 路由器广播 Root域名服务器 顶级域名服务器 目标域名服务器 DNS解析完成 操作系统发起TCP连接: TCP三次握手: TCP连接的建立采用经典的三次握手过程&#…

129基于matlab的粒子群算法、遗传算法、鲸鱼算法、改进鲸鱼算法优化最小二乘支持向量机(lssvm)的gam正则化参数和sig2RBF函数的参数

基于matlab的粒子群算法、遗传算法、鲸鱼算法、改进鲸鱼算法优化最小二乘支持向量机(lssvm)的gam正则化参数和sig2RBF函数的参数。输出适应度曲线,测试机和训练集准确率。程序已调通,可直接运行。 129 matlabLSSVM优化算法 (xiaoh…

10款强大的iPhone微信恢复软件:轻松恢复丢失的微信数据

微信已成为近年来最受欢迎的消息和社交媒体平台之一。它在全球拥有数百万用户,让人们能够联系、分享时刻并进行各种交易。随着微信的普及,对全面恢复解决方案的需求从未如此之大。本文探讨了专为 iPhone 用户设计的十款顶级微信恢复软件选项。每个软件都…

Copy of 一喷就能清新口气,更简单的漱口伴侣

平时日常维护口腔健康,除了要按时刷牙之外,每日清洁漱口也很有必要,这时使用专业漱口水效果更佳。平时我都是使用超市里常见的传统液体漱口水,偶然听牙医朋友说起市面上还有一款新的漱口云泡也很好用。就是目前我正在使用的这款清…

向数据库添加数据出现java.lang.NullPointerException

问题描述 向数据库中新增一条数据,出现 controller: Autowiredprivate ArticleService articleService;PostMappingpublic Result add(RequestBody Article article){articleService.add(article);return Result.success();} Service: Ser…

【STM32】HAL库的STOP低功耗模式UART串口唤醒BUG,第一个接收字节出错的问题(尚未解决,疑难杂症)

【STM32】HAL库的STOP低功耗模式UART串口唤醒BUG,第一个接收字节出错的问题(尚未解决,疑难杂症) 文章目录 BUG复现调试代码推测原因及改进方案尝试中断时钟供电外设唤醒方式校验码硬件问题 切换到STOP0模式尝试最终结论和猜想附录…

计算机网络-2019期末考试解析

【前言】 从内容上看比较像计算机网络课程了,先做了。 一.填空选择题(共 20 分,每空 1 分) 1 、双绞线由两根相互绝缘的、绞合成均匀的螺纹状的导线组成,下列关于双绞线的叙述,不正确的是___ __…

【SAP-PP】生产订单导入问题--完成日期向前推了一天

问题描述: 在执行BAPI_PRODORD_CREATE生产订单导入的时候,发现填写入模板中的基本完成日期是12月31日,但是到具体工单时变成了12月30日 截图说明: 感觉很神奇,咋一看,真的是日期提前了一天,de…

Next.js 学习笔记(六)——缓存

缓存 Next.js 可通过缓存渲染工作和数据请求来提高应用程序的性能并降低成本。本页将深入介绍 Next.js 缓存机制、可用于配置这些机制的 API 以及它们之间的交互方式。 需要知道:本页将帮助你了解 Next.js 的工作原理,但这并不是使用 Next.js 提高工作效…

1 月 21 日,三件事儿,线上不见不散丨社区活动

1 月 21 日,三件事儿,线上不见不散: RTE 开发者社区,三位联合主理人正式亮相,分享对于行业、社区与开发者人才发展的思考;「实时互动行业人才洞察2024」正式发布,关于行业、人才与生态的分析与…

【Python学习】Python学习13-日期和时间

目录 【Python学习】Python学习13-日期和时间 前言通过time 获取时间戳时间元组获取当前时间,格式化时间格式化时间转换python中时间日期格式化符号获取日历Time 模块日历(Calendar)模块其他模块参考 文章所属专区 Python学习 前言 本章节主…

Macos下修改Python版本

MacOS下修改Python版本 安装 查看本机已安装的Python版本:where python3 ~ where python3 /usr/bin/python3 /usr/local/bin/python3 /Library/Frameworks/Python.framework/Versions/3.12/bin/python3如果没有你想要的版本,去python官网下载安装包。…

【金猿案例展】黑龙江省粮食质量安全监测和技术中心——荣联助力黑龙江粮食仓储智能化升级...

‍ 荣联科技集团案例 本项目案例由荣联科技集团投递并参与“数据猿年度金猿策划活动——2023大数据产业年度创新服务企业榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 近年来,国家粮食和物资储备信息化工作取得了长足发展,但与新时…

C++ Primer 6.1 函数基础

函数的形参列表 int func(int v,int v2) {int v,v2;//!错误 } 函数返回类型 不能是数组和函数(两者都不接受对拷),但可以是指针 局部对象 形参和函数体内部的变量称为局部变量,仅在函数内部可见,隐藏外部…

行为型设计模式——策略模式

策略模式 策略模式非常简单,只需要将策略或者某个算法定义成一个类,然后传给需要使用的对象即可。**定义:**该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算…