Promise.allSettled优化并行接口报错

news2024/11/26 17:35:42

问题背景

后端需要前端请求同一个接口三次,每次传参不同可以获取到不同的结果=>构成计算资源的选项。
其中一个接口传参获取数据报错,导致整个计算资源都没有可选择的options:
在这里插入图片描述

前端代码使用Promise.all获取res1, res2, res3返回结果,其中任意res报错就会导致没有选项:

Promise.all([
  fetchStreamingResourceList({ xxx }),
  fetchStreamingResourceList({ xxx }),
  fetchStreamingResourceList({ xxx }),
])
  .then(([res1, res2, res3]) => {
    if (res1 && res2 && res3) {
      option.push(
        { ...options[0], ...res1 },
        { ...options[1], ...res2 },
        { ...options[2], ...res3 },
      )
      setOptionList(option)
    }
  })

目标:当其他有任一接口报错,其他正常获取的接口应当出现在选项中,而不是全部不显示

一、Promise.allSettled

promise状态:

  1. 初始化,状态:pending
  2. 当调用resolve(成功),状态:pengding=>fulfilled
  3. 当调用reject(失败),状态:pending=>rejected

解决Promise.all的痛点

当需要处理多个Promise并行时,大多数情况下Promise.all很方便,但是遇上reject:

const delay = n => new Promise(resolve => setTimeout(resolve, n));
 
 const promises = [
  delay(100).then(() => 1),
  delay(200).then(() => 2),
  Promise.reject(3)
 ]

Promise.all(promises)
    .then(values=>console.log(values))
    .catch(err=>console.log(err))
    // 加入catch语句后,最终输出:3,PromiseState:rejected

Promise.all能用catch捕获其中的异常,但发现其他执行成功的Promise的消息都丢失了,只返回一个最终状态:rejected。
要么全部成功,要么全部重来,这是Promise.all本身的强硬逻辑,也是痛点的来源。

Promise.allSettled

假如使用Promise.allSettled来处理这段逻辑会怎样呢?

const promises = [
  delay(100).then(() => 1),
  delay(200).then(() => 2),
  Promise.reject(3)
  ]

Promise.allSettled(promises).then(values=>console.log(values))
// 最终输出: 
//    [
//      {status: "fulfilled", value: 1},
//      {status: "fulfilled", value: 2},
//      {status: "rejected", value: 3},
//    ]

可以看到所有promise的数据都被包含在then语句中,每个promise的返回值多了一个status字段,表示当前promise的状态,没有任何一个promise的信息被丢失。

当用Promise.allSettled时,我们只需专注在then语句里,当有promise被异常打断时,我们依然能妥善处理那些已经成功了的promise。
问题解决

Promise.allSettled([
      xxx,
      xxx,
      xxx,
])
.then(results => {
    for (const [index, result] of results.entries()) {
      if (result.status === 'fulfilled' && result.value) {
        option.push({ ...options[index], ...result.value });
      }
    }
}

兼容性

在这里插入图片描述

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

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

相关文章

云原生docker-cgroup资源限制

概述 Docker 通过 Cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面, 基本覆盖了常见的资源配额和使用量控制。 Cgroup 是 ControlGroups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 CPU、…

【剑指offer】调整数组顺序使奇数位于偶数前面

文章目录 题目思路相对位置可以改变的思路相对位置不能改变的思路 题目 题目链接入口:调整数组顺序使奇数位于偶数前面 示例1: 输入:[1,2,3,4,5,6] 结果:[1,3,5,2,4,6] 示例2: 输入:[1,2,2,3,4,4,5,6,7…

2023年前端面试高频考点之 通信(渲染、http、缓存、异步、跨域)

目录 浏览器从输入url到渲染页面 过程⭐⭐⭐ Http和Https区别⭐⭐⭐ GET和POST发送请求⭐⭐⭐ 异同 http版本⭐⭐⭐ http状态码⭐⭐⭐ TCP⭐⭐⭐ 三次握手 四次挥手 流量控制(滑动窗口机制) 拥塞控制 keep-alive持久连接 TCP⭐⭐⭐ 三次握手…

Revit中绘制多坡度的迹线屋顶和构件对齐

一、Revit中创建特殊多坡度的迹线屋顶 在我们的日常生活中可以见到一些建筑屋顶为偏欧式风格的屋顶,而有时候在做迹线屋顶时也需要作出如图一所示的效果,说明特殊的多坡度屋顶也是应用非常广泛的,那我们应该如何实现绘制呢? 1.要得到如上图所…

Linux系统:安装及管理程序

安装及管理程序 一、linux源码包:1.源码包:2.二进制包:3.源码包的好处:4.源码包不足: 二、编译安装的过程:1.重点步骤: 三、挂载1.格式:2.挂载规则: 四、应用程序和系统命…

使用Jmeter进行性能测试的这套步骤,涨薪2次,升职一次

项目背景: 我们的平台为全国某行业监控平台,经过3轮功能测试、接口测试后,98%的问题已经关闭,决定对省平台向全国平台上传数据的接口进行性能测试。 01、测试步骤 1、编写性能测试方案 由于我是刚进入此项目组不久&#xff0c…

2023年专业连锁行业研究报告

第一章 行业概况 专业连锁行业是指以连锁经营模式运营的公司,其主要业务涵盖零售、餐饮、酒店、医疗、教育等领域。这些公司通过规模化、标准化的经营模式和供应链管理,提供专业化、高质量的产品和服务。专业连锁行业在全球范围内蓬勃发展,并…

LeetCode - 1 两数之和

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 1. 两数之和 - 力扣(LeetCode) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那 两个整数,并返回它们…

Jmeter接口测试实战篇:10分钟学会Jmeter的用法

一提到接口测试,通常大家会有这样的疑问:前端测试不是已经覆盖到各种业务逻辑了吗?为什么还要做接口测试,接口测试和前端测试是不是重复了?对于这个问题,可以从下面几个方面来解释: 什么是接口…

架构之冷热分离

本文依据《从程序员到架构师》阅读有感,记录书中案例并且结合作者工作经历进行分析。 当数据量过大,业务查询慢甚至导致数据库服务器CPU飙升,导致数据库宕机,影响用户体验。 场景: 1.客户两年多产生了近2000万的工单…

k聚类简单实现(灰度分割,分黑白)

加载图像: k聚类分割后图像,分成黑白两类,故意把结果黑色类染红,核对发现是正确的: 具体算法如下: float globu1 40; float globu2 180; public void k均值迭代法更新(int imgw, int imgh, byte…

云晶-新一代云上操作系统的新定义,价值,应用范围

本文,从人类社会信息化到数字化的演变过程,以及当前的企业数字化现状,并回顾信息技术的几次革命来阐述总结操作系统的价值和意义。我们基于行业发展规律,重新定义了云晶-云上操作系统的架构和建设要点。并给出了大胆设想。 您也许…

大模型部署实战(一)——Ziya-LLaMA-13B

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

【TA100 】图形 2.1 色彩空间介绍

->如何描述色彩 不要感性的认知,我们来 正经讨论,探究问题的本质- - ->色彩科学。 一、色彩发送器(光源发射角度) ->以面向对象的思想来理解: ● 出生点:光源 ● Object:射线&#…

15 【Vue-Router】

1.相关理解 1.1 vue-router 的理解 vue的一个插件库,专门用来实现SPA应用 1.2 对SPA应用的理解 1.单页Web应用(single page web application,SPA) 2.整个应用只有一个完整的页面 3.点击页面中的导航链接不会刷新页面&#xff…

STM32任务调度

目录 什么是任务调度? FreeRTOS的任务调度规则是怎样的? 抢占式调度运行过程 时间片调度运行过程 任务的状态 任务综合小实验 实验需求 cubeMX配置 什么是任务调度? 调度器就是使用相关的调度算法来决定当前需要执行的哪个任务。 Fr…

编程新手如何提高编程能力?

如果刚开始写代码时能读一读《整洁代码的艺术》那是个不错的选择。这本书会告诉您, 如何应用九大原则来提高编程能力。 良好的编程技能带来更整洁的代码, 让您更专注、更有效地利用时间,得到更高质量的结果。只要应用本书中提到的那些原则&am…

springboot集成rabbitmq

简介 RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 RabbitMQ 主要是为了实现系统之间的双向解耦而实…

【LeetCode】HOT 100(4)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

容器(第三篇)docker-cgroup资源限制

Docker 通过 Cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面, 基本覆盖了常见的资源配额和使用量控制。 Cgroup 是 ControlGroups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 CPU、内存、…