单例模式实现axios的封装(TS版本)

Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。

在日常前端开发过程中,我们一般是在main.ts(或main.js)中直接引入后挂载到vue上使用,没有单独分模块进行管理,不利于我们后期的代码维护,所以,在学习过面向对象设计原则后,我们要用ts的面向对象方法对其进行封装,而在一个项目中,一般axios是作为一个工具类被我们使用,也就是说可以只创建一个对象,所以这里可以模仿Java中springBoot的单例模式对其进行封装。

什么是单例模式?

单例模式是一种设计模式,其目的是确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。

在单例模式中,类只能有一个实例,并提供一个静态方法或函数来获取该实例。当第一次调用该方法或函数时,会创建实例,并将其保存起来。之后的调用都会返回已存在的实例,而不是创建新的实例。

单例模式的主要特点包括:

  1. 一个类只有一个实例。
  2. 提供一个全局访问点来获取该实例。
  3. 通过私有的构造函数来限制实例的创建。

单例模式的好处包括:

  1. 提供了一个全局的访问点,方便其他代码对实例进行操作。
  2. 避免了重复创建实例的开销,提高了性能。

在实际应用中,单例模式经常用于需要管理共享资源的场景,比如数据库连接池、线程池、缓存等。它可以确保资源的唯一性,并提供全局的访问方式,方便其他代码对资源进行操作。

用单例模式对Axios进行封装

TypeScript 复制代码
import axios, { AxiosInstance } from "axios";

interface Instance{
    baseURL: string;
    timeout: number;
    headers: object;
}

const instance: Instance = {
    baseURL: 'http://localhost:3000',
    timeout: 1000 * 5,
    headers: {
        'Content-Type': 'application/json'
    }
}

class Axios{

    private static axios: Axios = new Axios();

    private instance: AxiosInstance;

    private constructor(){
        this.instance = axios.create(instance);
        this.instance.interceptors.request.use(config => {
            if(sessionStorage.getItem("token")){
                config.headers.Authorization = sessionStorage.getItem("token")
            }
            return config;
        }, error => {
            console.log("错误", error)
            return Promise.reject(error)
        })
        this.instance.interceptors.response.use(response => {
            console.log("响应拦截=>", response);
            if(response.data.code >= 200 && response.data.code < 300){
                return response.data;
            }else{
                return Promise.reject(response.data)
            }
        })
    }

    public static getAxios(): Axios{
        return Axios.axios;
    }

    public getInstance(): AxiosInstance{
        return Axios.axios.instance;
    }
}

export default Axios;
相关推荐
tanyongxi6617 分钟前
C++ 特殊类设计与单例模式解析
java·开发语言·数据结构·c++·算法·单例模式
遗憾皆是温柔19 分钟前
24. 什么是不可变对象,好处是什么
java·开发语言·面试·学习方法
wearegogog12339 分钟前
C语言中的输入输出函数:构建程序交互的基石
c语言·开发语言·交互
Fine姐42 分钟前
The Network Link Layer: 无线传感器中Delay Tolerant Networks – DTNs 延迟容忍网络
开发语言·网络·php·硬件架构
HAPPY酷1 小时前
给纯小白的Python操作 PDF 笔记
开发语言·python·pdf
liulilittle1 小时前
BFS寻路算法解析与实现
开发语言·c++·算法·宽度优先·寻路算法·寻路
阿珊和她的猫1 小时前
autofit.js: 自动调整HTML元素大小的JavaScript库
开发语言·javascript·html
喜欢吃燃面2 小时前
C++算法竞赛:位运算
开发语言·c++·学习·算法
传奇开心果编程2 小时前
【传奇开心果系列】Flet框架实现的家庭记账本示例自定义模板
python·学习·ui·前端框架·自动化
草莓熊Lotso2 小时前
《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
开发语言·c++·经验分享·笔记·其他