参考资料:

https://www.jianshu.com/p/356f10ee476d

https://blog.csdn.net/aaqingying/article/details/122966849

https://www.cnblogs.com/hill-foryou/p/12512885.html

背景:

很多情况下,一个页面需要异步请求多个接口,这个时候可以使用Promise.all并且发送请求。但是,Promise.all中的任何一个promise出现错误的时候都会执行catch,导致其他正常返回的数据无法使用。

Promise.all基本特性

  • 接收一个 Promise 数组,执行结果返回一个新的 Promise
  • 所有 Promise 都成功的时候,返回的 Promise 才是成功
  • 要是有一个 Promise 失败,则返回的 Promise 是失败

Promise.all的基本使用

举个例子:

var p1 = Promise.resolve(1);
var p2 = Promise.resolve(2);
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, "3");
}); var p4 = Promise.reject(4);
var p5 = Promise.reject(5).catch((e) => e); // 情况1:promise全部resolve
Promise.all([p1, p2, p3]).then(values => {
console.log(values); // 其中p1、p2、p3都成功,所以进入then()
}).catch(function(err) {
console.log(err); // 永远走不到这里
}); // 情况2:promise有一个reject,且reject没有主动捕获异常
Promise.all([p1, p2, p4]).then(values => {
console.log(values); // 其中p4失败,且没有主动捕获p4异常,所以then()永远走不到这里
}).catch(function(err) {
console.log(err); // 4
}); // 情况3:promise有一个reject,且reject主动捕获异常
Promise.all([p1, p2, p5]).then(values => {
console.log(values); // 其中p5失败,但是主动捕获了p5的异常,所以进入then() [1,2,5]
}).catch(function(err) {
console.log(err);
}); // 情况4:使用Promise.allSettled
Promise.allSettled([p1, p2, p4]).then(values => {
console.log(values); // 其中p4失败,但是使用Promise.allSettled,所以进入then()返回一个带有对象数据新的Promise
}).catch(function(err) {
console.log(err);
});
上面代码的执行情况

Promise.all 异常处理

1.主动对每个请求的catch做处理

主动对每个失败的promise请求的catch做处理,使其正常的请求能返回。

例如:var p5 = Promise.reject(5).catch((e) => e);

Promise.all[]返回来的values数组,即使该请求失败了,在values数组也会返回你主动catch返回来的内容,一般可以是接口请求的错误信息或者是设置为undefined,然后在业务代码中,根据values数组的值判断做不同处理。达到一个接口失败不影响其他接口返回结果的目的。

2.使用Promise.allSettled(iterable)方法

  • 接收一个 Promise 数组,执行结果返回一个成功的 Promise
  • 返回 Promise 状态为成功
  • 返回 Promise 的值是一个数组

// 情况4:使用Promise.allSettled Promise.allSettled([p1, p2, p4]).then(values => { console.log(values); // 其中p4失败,但是使用Promise.allSettled,所以进入then()返回一个带有对象数据新的Promise }).catch(function(err) { console.log(err); });

Promise.allSettled

MDN文档

ES2020中,JavaScript提供了一个新语法Promise.allSettled。

无论参数实例是否reject,最终Promise.allSettled内部都会resolve,只不过会添加一个状态status来记录对应的参数实例是否执行成功。我们可以依据这个状态去过滤掉rejected的数据,只操作fulfilled的数据,就会得到我们想要的业务逻辑了。

搞清楚Promise.all的异常处理的更多相关文章

  1. 一文搞懂 Promise 新 Api allSettled 的用法和 all 区别,以及如何在不支持新特性的环境下实现一个 Polyfill

    开始 一文搞懂 Promise 新 Api allSettled 的用法和 all 区别,以及如何在不支持新特性的环境下实现一个 Polyfill allSettled 的用法 const runAl ...

  2. 动手搞一个Promise

    Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任 ...

  3. 深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise

    第一部分,Promise 加入 ES6 标准 原文地址 http://www.cnblogs.com/wangfupeng1988/p/6515855.html 未经作者允许不得转载! 从 jquer ...

  4. js构建ui的统一异常处理方案(四)

    上一篇我们介绍了统一异常处理方案的设计方案,这一篇我们将直接做一个小例子,验证我们的设计方案. 例子是一个todo的列表界面(页面代码参考于https://github.com/zongxiao/Dj ...

  5. js构建ui的统一异常处理方案(二)

    上一篇文章,我分析了同步代码做异常处理是基于责任链模式,而通过try.catch等语句可以很容易地实现这种责任链模式.但是如果是异步调用,我们无法直接通过try.catch语句实现责任链模式,并且通过 ...

  6. 手把手教你实现一个完整的 Promise

    用过 Promise,但是总是有点似懂非懂的感觉,也看过很多文章,还是搞不懂 Promise的 实现原理,后面自己边看文章,边调试代码,终于慢慢的有感觉了,下面就按自己的理解来实现一个 Promise ...

  7. Struts2之异常处理

    一.学习案例:通过在input.jsp页面输入登录账号和password測试异常处理机制. 二.案例分析:struts2提供了局部异常处理机制和全局异常处理机制.局部优先于全局异常处理,当异常找不到局 ...

  8. 前端 ----- 初探ES6 Promise

    前段时间做项目,在调用接口的时候,遇到了异步问题.开始是使用定时器,发现效果并不理想,于是又用了回调,效果还好但是,很明显的影响了代码的整洁性. 于是我想起了在面试的那段时间,背过的面试题里,出现过一 ...

  9. JavaScript 异步编程的前世今生(上)

    前言 提到 JavaScript 异步编程,很多小伙伴都很迷茫,本人花费大约一周的业余时间来对 JS 异步做一个完整的总结,和各位同学共勉共进步! 目录 part1 基础部分 什么是异步 part2 ...

  10. 深入理解 JavaScript 异步——转载

    本文章转载于深入理解 JavaScript 异步 前言 2014年秋季写完了<深入理解javascript原型和闭包系列>,已经帮助过很多人走出了 js 原型.作用域.闭包的困惑,至今仍能 ...

随机推荐

  1. Asp.Net MVC中点击按钮导出Excel

    一.Excel导出帮助类,要安装包NPOI 1 using NPOI.HSSF.UserModel; 2 using NPOI.SS.UserModel; 3 using System; 4 usin ...

  2. c++基础之函数

    距离上次更新又过了一周,又该更新新的读书笔记了.本次更新的主要是c++中函数部分的内容 c++ 中的函数与c语言中的函数大致用法或者语法是一样的,这里就不就这点详细展开了.需要注意的是c/c++中并没 ...

  3. TienChin 活动管理-添加活动接口

    ActivityController @PreAuthorize("hasPermission('tienchin:activity:create')") @Log(title = ...

  4. 设计模式学习-使用go实现解释器模式

    解释器模式 定义 优点 缺点 适用范围 代码实现 参考 解释器模式 定义 解释器模式(interpreter):给定一种语言,定义它的文法的一种表示,并定一个解释器,这个解释器使用该表示来解释语言中的 ...

  5. 【二】强化学习之Parl基础命令--PaddlePaddlle及PARL框架{飞桨}

    相关文章: [一]飞桨paddle[GPU.CPU]安装以及环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简 ...

  6. C/C++ 实现获取Linux系统参数

    今天忙活了半天,在Linux平台下,总算可以获取到一些性能指标了,结果,Linux上面的数据发送到Windows上面会出现发送为空的现象,可能是Socket套接字存在问题,不搞了. #include ...

  7. Docker从认识到实践再到底层原理(六-2)|Docker容器操作实例

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 然后就是博主最近最花时间的一 ...

  8. 【链表】链表的合并【经典面试OJ详解】【力扣21,力扣23】超详细的算法教程

    链表的合并 导航小助手 说在前面 题目链接 链表结构 OJ21.合并两个有序链表 题目描述和算法分析 接口的完整实现代码 OJ23.合并K个升序链表 题目描述和算法分析 接口的完整实现代码 尾声 说在 ...

  9. ABC311_g One More Grid Task 题解

    题目链接:Atcoder 或者 洛谷 对于解决二维区间内的最值类型问题,我们常常有一类特别好用的方法,就是悬线法,它可以看做是单调栈的子集,但更加好理解和书写. 对于悬线法,我们有一个常见的模型,找出 ...

  10. P8575 「DTOI-2」星之河 题解

    题目链接:星之河 比较经典的偏序问题.区别于强制在线类算法:树套树之类的,对于偏序问题,我们有许多种优秀的离线算法,比如此篇要讲的 cdq 分治. 它更偏向于一种思想,它的思想使得它对偏序类问题,往往 ...