如何使用Promise.any()处理多个异步操作?

21 阅读2分钟

我用最简单、最实用、能直接复制到项目里的方式,教你怎么用​Promise.any() ​​ 处理多个异步请求,一步到位看懂。

一、先记住核心规则(最重要)

​Promise.any()​​ 接收一个Promise 数组,作用只有两个:

  1. 只要有一个成功,就立刻返回这个成功的结果
  2. 全部都失败,才会进入失败(返回错误集合)

一句话:抢第一个成功的结果


二、最基础用法(直接复制就能用)

// 模拟 3 个异步请求
const p1 = new Promise((resolve, reject) => setTimeout(reject, 100, '请求1失败'))
const p2 = new Promise((resolve, reject) => setTimeout(resolve, 200, '请求2成功'))
const p3 = new Promise((resolve, reject) => setTimeout(reject, 300, '请求3失败'))

// 使用 Promise.any()
Promise.any([p1, p2, p3])
  .then(result => {
    // 只要有一个成功,就走这里
    console.log('最先成功的结果:', result)
  })
  .catch(err => {
    // 全部失败才走这里
    console.log('所有请求都失败了')
  })

输出:

最先成功的结果:请求2成功

三、真实项目场景:多个接口取最快可用的

这是 最常用的场景: 你有多个备用接口,哪个先通就用哪个

// 定义多个接口请求
async function fetchApi1() {
  const res = await fetch('https://api1.com/data')
  return res.json()
}

async function fetchApi2() {
  const res = await fetch('https://api2.com/data')
  return res.json()
}

async function fetchApi3() {
  const res = await fetch('https://api3.com/data')
  return res.json()
}

// 同时请求,谁先成功用谁
async function getData() {
  try {
    const result = await Promise.any([
      fetchApi1(),
      fetchApi2(),
      fetchApi3()
    ])
    console.log('可用数据:', result)
  } catch (err) {
    console.log('所有接口都挂了')
  }
}

getData()

四、如果全部失败了怎么办?

​Promise.any()​​ 会抛出 AggregateError(错误集合)。

你可以拿到所有错误信息

const p1 = Promise.reject('错误1')
const p2 = Promise.reject('错误2')
const p3 = Promise.reject('错误3')

Promise.any([p1, p2, p3])
  .catch(err => {
    console.log(err) // AggregateError
    console.log(err.errors) // [ '错误1', '错误2', '错误3' ]
  })

五、必须记住:和 race() 的区别(面试常问)

  • Promise.race() :谁先完成就返回谁,失败也算
  • Promise.any() :只返回第一个成功的,失败会被跳过

例子一眼看懂:

const p1 = Promise.reject('失败')
const p2 = Promise.resolve('成功')

Promise.race([p1, p2]).catch(e => console.log(e)) // 失败(因为p1更快)
Promise.any([p1, p2]).then(res => console.log(res)) // 成功(只看成功)

六、总结(最简单记忆)

  • 用来做什么:同时发多个异步,取第一个成功的结果
  • 什么时候用:接口容灾、多线路优选、抢最快响应
  • 成功条件:任意一个成功
  • 失败条件:全部失败
  • 错误类型:​​AggregateError​

需要我给你写一个可直接运行的完整 axios + Promise.any 实际项目模板吗?你复制就能用在项目里。