你为什么还在用Promise.all?

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

什么是JavaScript中的Promise

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

const promise = new Promise((resolve, reject) => {// Some asynchronous operationif (/* 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.hqwc.cn/news/341047.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

halcon 标定板像素当量的标定

背景:当镜头不是远心镜头时,FA镜头没法知道一个像素的尺寸。 1、标定板信息 标定板7*7,圆的直径是1.25mm,两个圆的距离是2.5mm,求出每排两两圆心距的像素距离,然后平均值。两点的真实距离为D,…

Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent

文章目录 Pre概述Code源码分析 Pre Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent 概述 Spring Boot 的广播机制是基于观察者模式实现的,它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#…

Tensorflow2.0笔记 - Tensor的数据索引和切片

主要涉及的了基础下标索引"[]",逗号",",冒号":",省略号"..."操作,以及gather,gather_nd和boolean_mask的相关使用方法。 import tensorflow as tf import numpy as nptf.__version__tensor tf.random.uniform([1,5,5,3],…

电脑可以连接网络但浏览器无法访问部分或全部网页

啾咪!离大谱了,电脑一段时间没有用,最近打开却发现可以连接网络但是无法访问部分网页(如CSDN),显示如下: 有三种解决方法: (1)清除DNS缓存 步骤:…

归并排序例题——逆序对的数量

做道简单一点的题巩固一下 归并排序实现步骤 将整个区间 [l, r] 划分为 [l, mid] 和 [mid1, r]。 递归排序 [l, mid] 和 [mid1, r]。 将左右两个有序序列合并为一个有序序列。 题目描述 给定一个长度为 n 的整数数列,请计算数列中的逆序对的数量。 逆序对的定义…

基础篇_开发命令行程序(输入输出,类型、变量、运算符,条件语句,循环语句,方法,package与jar)

文章目录 一. 输入输出1. System.out2. System.in3. Scanner4. 变量名5. 关键字 二. 类型、变量、运算符1. 字符与字符串字符值与字符串值转义字符文本块 2. 类型何为类型数字类型字符类型 3. 变量与运算符变量运算符 4. 练习 - 房贷计算器Math.pow()数字格式化查阅 Javadoc 三…

git 的安装

git 的安装 在我们开始使用 Git 前,需要将它安装在我们的电脑上。即便已经安装,最好将它升级到最新的版本。 我们可以通过软件包或者其它安装程序来安装,或者下载源码编译安装。 本文只介绍通过在 windows 上安装软件包的方式,其…

每日一题——LeetCode1103.分糖果 ||

方法一 个人方法: 有多少人就创建多大的数组并把数组的所有元素初始化为0,只要还有糖果,就循环给数组从头到尾添加糖果,每次分的糖果数递增1,最后可能刚好分完也可能不够,不够就还剩多少给多少。 var dis…

Maven和MyBatis框架简单实现数据库交互

MyBatis是一种基于Java语言的持久层框架,它的主要目的是简化与数据库的交互过程。MyBatis通过XML或注解配置来映射Java对象和数据库表之间的关系,并提供了灵活的查询方式和结果集处理机制。MyBatis还提供了事务管理、缓存机制、插件扩展等特性。 使用My…

电阻如何读取阻值

前言:大家经常见到的贴片电阻上的丝印有纯数字、数字与R组合、数字与除R之外的字母组合的,但大家知不知道这样的标注与贴片电阻的i精度相关?同一个阻值因为精度不同,标注也会不同。例如封装为0805的贴片电阻,丝印473和…

Vue-8、Vue事件处理

1、点击事件 <!DOCTYPE html> <html lang"en" xmlns:v-model"http://www.w3.org/1999/xhtml" xmlns:v-bind"http://www.w3.org/1999/xhtml"xmlns:v-on"http://www.w3.org/1999/xhtml"> <head><meta charset&quo…

小家电应用解决方案以及选型指南

电磁炉是现代厨房中常见的一种小家电产品&#xff0c;它利用电磁感应加热原理&#xff0c;可以快速、高效地进行烹饪。在电磁炉的设计和制造过程中&#xff0c;功率开关芯片的选择对于产品的性能和成本有着重要的影响。 针对电磁炉的应用需求&#xff0c;推荐采用LED驱动芯片S…