如何实现“axios 多个请求值错误只显示一个”

介绍

在前端开发中,我们经常需要使用异步请求来获取数据。而如果同时发送多个请求,当其中某个请求出错时,我们可能只希望显示一个错误提示,而不是每个请求都单独显示错误。本文将介绍如何使用 axios 来实现这个功能。

整体流程

为了方便理解,下面是实现“axios 多个请求只显示一个错误”的整体流程图:

gantt
    title 实现“axios 多个请求只显示一个错误”的流程

    section 初始化
    初始化axios  :a1, 2022-01-01, 1d
    初始化错误信息集合  :a2, after a1, 1d

    section 发送请求
    发送请求1  :a3, after a2, 2d
    发送请求2  :a4, after a3, 1d

    section 处理响应
    处理响应1  :a5, after a4, 1d
    处理响应2  :a6, after a5, 1d

    section 显示错误
    显示错误信息  :a7, after a6, 1d

代码实现

下面是实现“axios 多个请求只显示一个错误”的具体步骤和代码:

步骤一:初始化 axios

在开始发送请求之前,我们需要先初始化 axios,以便使用它发送异步请求。在项目的入口文件中,添加以下代码:

import axios from 'axios';

// 创建一个 axios 实例
const instance = axios.create();

// 添加响应拦截器
instance.interceptors.response.use(
  response => response,
  error => Promise.reject(error)
);

export default instance;

这段代码会创建一个单独的 axios 实例,并添加一个响应拦截器。该拦截器用于统一处理所有请求的错误。

步骤二:发送请求

在需要发送请求的地方,使用以下代码发送多个请求:

import axiosInstance from './axiosInstance';

// 发送请求1
axiosInstance.get('/api/endpoint1')
  .then(response => {
    // 处理响应
  })
  .catch(error => {
    // 错误处理
  });

// 发送请求2
axiosInstance.get('/api/endpoint2')
  .then(response => {
    // 处理响应
  })
  .catch(error => {
    // 错误处理
  });

这段代码使用了我们之前初始化的 axios 实例来发送多个请求。每个请求都可以单独处理响应和错误。

步骤三:处理响应

在处理响应时,我们可以根据实际需要进行数据处理或展示。在这个示例中,我们只需要保留错误信息即可:

// 处理响应1
axiosInstance.get('/api/endpoint1')
  .then(response => {
    // 根据实际情况处理数据
  })
  .catch(error => {
    // 错误处理
    throw error; // 抛出异常,将错误信息传递给下一个 catch
  });

// 处理响应2
axiosInstance.get('/api/endpoint2')
  .then(response => {
    // 根据实际情况处理数据
  })
  .catch(error => {
    // 错误处理
    throw error; // 抛出异常,将错误信息传递给下一个 catch
  });

这段代码中的 catch 语句会将错误信息传递给下一个 catch 语句,以便在统一的错误处理中显示。

步骤四:显示错误信息

在最后一步,我们需要统一处理所有的错误,并只显示一个错误提示。我们可以使用一个集合来存储错误信息,并在最后进行处理。

const errorMessages = [];

// 处理响应1
axiosInstance.get('/api/endpoint1')
  .then(response => {
    // 根据实际情况处理数据
  })
  .catch(error => {
    // 错误处理
    errorMessages.push(error.message); // 将错误信息添加到集合中
    throw error; // 抛出异常,将错误信息传递给下一个 catch
  });

// 处理响应2
axiosInstance.get('/api/endpoint2')
  .then(response