如何在 Axios 中封装事件中心EventEmitter

在 Axios 中封装一个事件中心 EventEmitter 允许你在请求的不同阶段(如请求开始、请求成功、请求失败等)触发事件。这可以通过创建一个自定义的 Axios 实例,并结合 Node.js 的 events 模块来实现。以下是一个详细的步骤指南和示例代码,展示了如何在 Axios 中封装一个事件中心。

步骤 1: 安装 Axios

首先,确保你已经安装了 Axios。如果还没有安装,可以使用 npm 或 yarn 进行安装:

bash 复制代码
npm install axios

或者

bash 复制代码
yarn add axios

步骤 2: 创建事件中心类

接下来,创建一个新的类,该类将继承自 Node.js 的 EventEmitter 类,并封装 Axios 实例。

javascript 复制代码
const axios = require('axios');
const EventEmitter = require('events');

class AxiosEventEmitter extends EventEmitter {
  constructor(baseURL = '') {
    super();
    this.axiosInstance = axios.create({
      baseURL: baseURL,
      // 可以在这里添加其他 Axios 配置
    });

    // 设置请求拦截器
    this.axiosInstance.interceptors.request.use(
      config => {
        // 在请求发送前触发事件
        this.emit('request-start', config);
        return config;
      },
      error => {
        // 请求错误时触发事件
        this.emit('request-error', error);
        return Promise.reject(error);
      }
    );

    // 设置响应拦截器
    this.axiosInstance.interceptors.response.use(
      response => {
        // 请求成功时触发事件
        this.emit('response-success', response);
        return response;
      },
      error => {
        // 响应错误时触发事件
        this.emit('response-error', error);
        return Promise.reject(error);
      }
    );
  }

  // 封装 Axios 的请求方法
  request(config) {
    return this.axiosInstance(config);
  }

  get(url, params = {}, config = {}) {
    return this.axiosInstance.get(url, { params, ...config });
  }

  post(url, data = {}, config = {}) {
    return this.axiosInstance.post(url, data, config);
  }

  // 可以根据需要添加更多的封装方法,如 put, delete 等
}

module.exports = AxiosEventEmitter;

步骤 3: 使用封装的事件中心

现在,你可以在你的应用程序中使用这个封装好的 AxiosEventEmitter 类。

javascript 复制代码
const AxiosEventEmitter = require('./path/to/AxiosEventEmitter');

const emitter = new AxiosEventEmitter('https://api.example.com');

// 监听事件
emitter.on('request-start', config => {
  console.log('Request started:', config.url);
});

emitter.on('response-success', response => {
  console.log('Response succeeded:', response.data);
});

emitter.on('request-error', error => {
  console.error('Request error:', error.message);
});

emitter.on('response-error', error => {
  console.error('Response error:', error.response ? error.response.data : error.message);
});

// 发起一个 GET 请求
emitter.get('/some-endpoint')
  .then(response => {
    // 处理响应
  })
  .catch(error => {
    // 处理错误
  });

在这个示例中,AxiosEventEmitter 类封装了 Axios 实例,并添加了请求和响应拦截器来触发事件。然后,你可以在你的应用程序中创建这个类的实例,并监听你感兴趣的事件。当请求开始时、成功时、或遇到错误时,相应的事件监听器将被调用。

相关推荐
齐 飞15 小时前
VUE2常用语法总结
javascript·vue.js
Data analyse45615 小时前
web-vitals库接入:LCP、INP、CLS上报与阈值
前端·javascript·数据分析
北城笑笑15 小时前
Vue 106 ,上篇:前端桌面端应用实现方案( Electron 框架详细介绍,Vue + Electron )
前端·javascript·vue.js·python·electron
柳杉15 小时前
别再手抠特效帧了:一个能"看图改图"的像素特效库 + Claude Code Skill
前端·javascript
前端小D15 小时前
React Native项目开发(iOS侧为例)
javascript·react native·react.js
幸运小猿1 天前
模拟慢上传-处理超时重试image 丢失线上问题
前端·javascript·html
速易达网络1 天前
ECharts 图表制作完全指南:从零到可视化实战
前端·javascript·echarts
paopaokaka_luck1 天前
灾害应急物资管理系统(AI应急助手、Echarts可视化数据看板、捐赠入库联动、 物资全流程管理、库存变动追溯、灾情资讯与互动反馈、物资发放公示)
java·前端·javascript·spring boot·mysql·tomcat·echarts
kyriewen1 天前
我验了 7 种 sticky 失效说法:3 种根本不成立
前端·javascript·程序员
我命由我123451 天前
Python 实用操作 - 文件操作(打开与关闭文件、读取文件、文件写入)
java·开发语言·前端·javascript·数据库·python·java-ee