Promise.all 的异常处理,我希望大家一定要了解一下!

开发 前端
Promise.all还是很好用的,但是问题来了,其中有一个错误的话,就只会输出这个失败的值,而忽略了其他成功的值,那咋办呢?

前言

大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心

背景

咱们在开发中,大多数时间都是一个异步操作一个异步操作去执行的,但是有一些特殊情况,需要一股脑去执行多个异步操作,比如:

  • 多表单校验:只有所有表单都校验通过才能提交
  • 多接口请求:只有所有接口都请求成功才能进行下一步操作

这时候就可以用到Promise.all这个方法了

Promise.all

基本特性

简单说说这个方法的使用或特性吧:

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

基本使用

// 模拟异步操作
const request = (delay, flag = true) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (flag) {
        resolve(`成功了${delay}`)
      } else {
        reject(`失败了${delay}`)
      }
    }, delay)
  })
}

const fun = async (promises) => {
  Promise.all(promises)
    .then(res => {
      console.log('res', res)
    })
    .catch(error => {
      console.log('error', error)
    })
}

fun([request(1000), request(500)])
// res [ '成功了1000', '成功了500' ]
fun([request(1000), request(500, false)])
// error 失败了500

问题

Promise.all还是很好用的,但是问题来了,其中有一个错误的话,就只会输出这个失败的值,而忽略了其他成功的值,那咋办呢?我们需要自己去收集才行:

const fun = async (promises) => {
  Promise.all(
    promises.map(promise => {
      return promise.catch(err => err)
    })
  )
    .then(res => {
      console.log('res', res)
    })
}

fun([request(1000), request(500, false)])
// res [ '成功了1000', '失败了500' ]

Promise.allSettled

其实在ES2020中,JavaScript提供了一个新语法Promise.allSettled,他能直接完成我们上面所做的处理:

  • 接收一个 Promise 数组,执行结果返回一个成功的 Promise
  • 返回 Promise 状态为成功
  • 返回 Promise 的值是一个数组
const fun = async (promises) => {
  Promise.allSettled(promises)
    .then(res => {
      console.log('res', res)
    })
}

fun([request(1000), request(500, false)])
// res [
//   { status: 'fulfilled', value: '成功了1000' },
//   { status: 'rejected', reason: '失败了500' }
// ]

责任编辑:武晓燕 来源: 前端之神
相关推荐

2020-12-03 10:17:25

Kubernetes架构微服务

2021-03-15 12:00:19

Kubernetes微服务架构

2016-08-12 22:27:32

大数据小趋势

2018-07-02 08:57:27

码农业务程序员

2022-08-31 22:50:13

JavaScript函数JSON

2020-12-02 10:53:39

区块链技术

2022-06-13 09:26:41

Promise前端代码

2023-10-04 07:25:59

JavaScriptpromises

2016-12-27 13:10:37

2019-11-07 15:20:07

JavaCollectorsteeing

2020-02-10 14:26:10

GitHub代码仓库

2023-09-26 07:43:22

工具骨架屏页面

2020-12-10 08:44:35

WebSocket轮询Comet

2021-11-19 10:25:23

MySQL数据库架构

2018-04-02 14:21:43

互联网物联网

2022-03-24 13:36:18

Java悲观锁乐观锁

2021-07-06 14:56:20

深度学习编程人工智能

2013-08-09 10:44:55

创始人创业独立创业

2020-03-01 17:53:38

Excel大数据微软

2010-11-19 16:02:42

IT族
点赞
收藏

51CTO技术栈公众号