详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)

yizhihongxing

详解 axios 中封装使用、拦截特定请求、判断所有请求加载完毕

封装 Axios

Axios 是一款基于 Promise 的 HTTP 请求库,让我们在浏览器端和 Node.js 中发起 HTTP 请求变得非常容易。但是,为了更好的使用和维护,我们需要对 Axios 进行封装。

我们可以将 Axios 封装成一个单独的模块,该模块会创建一个新的 Axios 实例,设置默认配置,封装公共的请求逻辑和错误处理,然后将封装后的 Axios 实例导出。

以下是一个简单的封装示例:

import axios from 'axios'
import config from '@/config'

const request = axios.create({
  baseURL: config.baseURL,
  timeout: config.timeout,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
})

// 请求拦截器
request.interceptors.request.use(config => {
  // 在请求发送之前做些什么,例如加入 Token
  return config
}, error => {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 响应拦截器
request.interceptors.response.use(response => {
  // 对响应数据做些什么
  return response.data
}, error => {
  // 对响应错误做些什么
  return Promise.reject(error)
})

export default request

拦截特定请求

在开发中,我们经常会遇到需要拦截某些特定的请求,如请求超时、请求错误等。为了实现这些功能,Axios 提供了拦截器机制。

以下是针对请求超时和请求错误的特定请求拦截器示例:

import axios from 'axios'
import config from '@/config'

const request = axios.create({
  baseURL: config.baseURL,
  timeout: config.timeout,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
})

// 请求拦截器
request.interceptors.request.use(config => {
  // 在请求发送之前做些什么,例如加入 Token
  return config
}, error => {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 响应拦截器
request.interceptors.response.use(response => {
  // 对响应数据做些什么
  return response.data
}, error => {
  // 对响应错误做些什么
  if (error && error.response) {
    switch (error.response.status) {
      case 400:
        error.message = '请求错误'
        break
      case 401:
        error.message = '未授权,请登录'
        break
      case 403:
        error.message = '拒绝访问'
        break
      case 404:
        error.message = `请求地址出错: ${error.response.config.url}`
        break
      case 408:
        error.message = '请求超时'
        break
      case 500:
        error.message = '服务器内部错误'
        break
      case 501:
        error.message = '服务未实现'
        break
      case 502:
        error.message = '网关错误'
        break
      case 503:
        error.message = '服务不可用'
        break
      case 504:
        error.message = '网关超时'
        break
      case 505:
        error.message = 'HTTP版本不受支持'
        break
      default:
    }
  }
  return Promise.reject(error)
})

export default request

注意,在响应拦截器中,我们需要根据响应错误的状态码进行不同的错误处理。

判断所有请求加载完毕

当我们需要在所有的请求都加载完毕后执行某些操作时,可以使用 Axios 提供的并发处理机制。Axios 并发请求返回的是一个 Promise 数组,我们可以使用 Promise.all() 方法将这些 Promise 组合成一个 Promise,然后在 Promise.then() 方法中处理返回的结果。

以下是判断所有请求加载完毕的示例:

import axios from 'axios'
import config from '@/config'

const request = axios.create({
  baseURL: config.baseURL,
  timeout: config.timeout,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
})

// 请求拦截器
request.interceptors.request.use(config => {
  // 在请求发送之前做些什么,例如加入 Token
  return config
}, error => {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 响应拦截器
request.interceptors.response.use(response => {
  // 对响应数据做些什么
  return response.data
}, error => {
  // 对响应错误做些什么
  if (error && error.response) {
    switch (error.response.status) {
      case 400:
        error.message = '请求错误'
        break
      case 401:
        error.message = '未授权,请登录'
        break
      case 403:
        error.message = '拒绝访问'
        break
      case 404:
        error.message = `请求地址出错: ${error.response.config.url}`
        break
      case 408:
        error.message = '请求超时'
        break
      case 500:
        error.message = '服务器内部错误'
        break
      case 501:
        error.message = '服务未实现'
        break
      case 502:
        error.message = '网关错误'
        break
      case 503:
        error.message = '服务不可用'
        break
      case 504:
        error.message = '网关超时'
        break
      case 505:
        error.message = 'HTTP版本不受支持'
        break
      default:
    }
  }
  return Promise.reject(error)
})

// 并发处理多个请求
const requests = [
  request.get('/api/user'),
  request.get('/api/order'),
  request.get('/api/product')
]

Promise.all(requests).then(([user, order, product]) => {
  console.log(user, order, product)
}).catch(error => {
  console.log(error)
})

export default request

以上示例中,我们将三个不同的请求组成一个数组 requests,然后使用 Promise.all() 方法并发处理这些请求,当所有请求加载完毕后,会调用 Promise.then() 方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解axios中封装使用、拦截特定请求、判断所有请求加载完毕) - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • C语言由浅入深了解变量的应用

    C语言由浅入深了解变量的应用 什么是变量 在C语言中,变量代表着可以被存储、读取或者修改的数据单元,而数据单元可以是整型、字符型、浮点型等数据类型。在程序中,变量必须先被声明,才能被使用。在C语言中,变量分为局部变量和全局变量两种类型。 如何声明和定义变量 变量的声明指的是告诉编译器变量的名称和类型,而变量的定义则是分配内存空间,为变量分配初始值。 下面是一…

    other 2023年6月27日
    00
  • iOS13.1.1正式版固件下载地址 iOS13.1.1下载

    iOS13.1.1正式版固件下载地址 iOS13.1.1下载攻略 简介 iOS13.1.1是苹果公司发布的最新版本的iOS操作系统。本攻略将详细介绍如何下载iOS13.1.1正式版固件,并提供两个示例说明。 步骤 步骤一:备份设备 在开始下载iOS13.1.1之前,建议您先备份您的设备以防止数据丢失。您可以通过iCloud或iTunes进行备份。 步骤二:检…

    other 2023年8月5日
    00
  • Qt定时器和随机数详解

    Qt定时器和随机数详解 一、什么是Qt定时器 Qt定时器用于在一定时间间隔内执行任务,可以实现定时刷新UI、定时发送消息等功能。它与用户界面线程一起循环运行,并在主线程中处理事件,因此可以避免在主线程中阻塞任务的情况。 1.1 创建定时器 要创建一个定时器,我们可以使用QTimer类。比如: QTimer *timer = new QTimer(this);…

    other 2023年6月26日
    00
  • mysql中insert与select的嵌套使用方法

    MySQL中INSERT与SELECT的嵌套使用方法攻略 在MySQL中,可以使用INSERT和SELECT语句的嵌套使用来实现一些复杂的数据操作。这种嵌套使用可以帮助我们在一个查询中将数据插入到另一个表中,或者在插入数据时使用查询结果作为插入的值。下面是详细的攻略,包含两个示例说明。 示例1:将查询结果插入到另一个表中 假设我们有两个表:table1和ta…

    other 2023年7月28日
    00
  • 图解Java ReentrantLock公平锁和非公平锁的实现

    图解Java ReentrantLock公平锁和非公平锁的实现攻略 什么是ReentrantLock ReentrantLock是一个可重入锁,也称为互斥锁,它比Java原生的synchronized更加灵活,支持公平锁和非公平锁,并且可以通过tryLock方法尝试获取锁,给予更好的控制和扩展。 公平锁和非公平锁 公平锁和非公平锁都是指ReentrantLo…

    other 2023年6月26日
    00
  • 常见网页编辑器(富文本 markdown 代码编辑等)

    以下是关于常见网页编辑器(富文本、Markdown、代码编辑等)的完整攻略,包括定义、使用方法、示例说明和注意事项。 定义 常见网页编辑器是用于创建和编辑网页的工具。它们可以分为三类:富文本编辑器、Markdown编辑器和代码编辑器。富文本编辑器提供了类似于Microsoft Word的界面,可以通过拖放、复制和粘贴等方式创建和编辑网页内容。Markdown…

    other 2023年5月8日
    00
  • windows8系统添加鼠标右键清空回收站选项(通过导入注册表实现)

    首先,需要说明的是,在进行任何注册表操作时,请确保备份重要数据以防不测发生。以下是实现“Windows8系统添加鼠标右键清空回收站选项”的完整攻略: 打开记事本,将以下内容拷贝到记事本中: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F0…

    other 2023年6月27日
    00
  • stm32之入门知识

    STM32之入门知识 STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统开发。本文将提供一个完整的攻略,介绍STM32的入门知识,包括硬件和软件方面内容,并提供两个示例说明。 硬件 开发板 STM32开发板是学习和开发STM32的必备硬件常见的STM32开发板有ST官方的Nucleo系列、Discovery系列和EVAL系列,以…

    other 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部