当前位置:首页 > 技术分析 > 正文内容

前端知识点-axios 的拦截器原理及应用,并简单手写核心逻辑

ruisui8813小时前技术分析2

Axios 拦截器允许在请求和响应阶段插入处理逻辑。以下是其原理、实现及优雅应用:

拦截器原理

  1. 队列结构:请求和响应拦截器分别存储在队列中,请求拦截器在发送请求前执行,响应拦截器在接收响应后执行。
  2. Promise 链:通过构建 Promise 链,依次执行拦截器处理函数。请求拦截器按添加顺序执行,响应拦截器同样按添加顺序执行。
  3. 错误处理:任一拦截器返回 rejected Promise 会跳过后续拦截器,直接进入错误处理。

手写核心逻辑

class InterceptorManager {
  constructor() {
    this.handlers = [];
  }

  use(fulfilled, rejected) {
    this.handlers.push({ fulfilled, rejected });
  }
}

class Axios {
  constructor() {
    this.interceptors = {
      request: new InterceptorManager(),
      response: new InterceptorManager(),
    };
  }

  request(config) {
    let chain = [this.dispatchRequest, undefined]; // 初始链

    // 请求拦截器按顺序插入到链首
    this.interceptors.request.handlers.reverse().forEach(interceptor => {
      chain.unshift(interceptor.fulfilled, interceptor.rejected);
    });

    // 响应拦截器按顺序添加到链尾
    this.interceptors.response.handlers.forEach(interceptor => {
      chain.push(interceptor.fulfilled, interceptor.rejected);
    });

    let promise = Promise.resolve(config);

    while (chain.length) {
      promise = promise.then(chain.shift(), chain.shift());
    }

    return promise;
  }

  dispatchRequest(config) {
    // 模拟实际请求
    return new Promise(resolve => {
      setTimeout(() => resolve({ data: config.url, status: 200 }), 100);
    });
  }
}

// 使用示例
const axios = new Axios();

// 添加请求拦截器
axios.interceptors.request.use(config => {
  console.log('请求拦截器1');
  config.headers = { Authorization: 'Bearer token' };
  return config;
});

axios.interceptors.request.use(config => {
  console.log('请求拦截器2');
  return config;
});

// 添加响应拦截器
axios.interceptors.response.use(response => {
  console.log('响应拦截器1');
  return response.data; // 返回处理后的数据
});

axios.interceptors.response.use(response => {
  console.log('响应拦截器2');
  return response;
});

axios.request({ url: '/api/data' })
  .then(data => console.log('成功:', data))
  .catch(err => console.error('失败:', err));

拦截器应用场景

  1. 请求处理
  2. 添加认证头:config.headers.Authorization = 'Bearer token'
  3. 请求数据格式化:转换数据格式或加密
  4. 响应处理
  5. 统一错误处理:检查状态码,处理 401 跳转登录
  6. 数据解析:提取响应数据,如 return response.data
  7. 全局Loading
  8. 请求前显示 Loading,响应后隐藏

优雅实践建议

  1. 模块化:将拦截器拆分到独立文件,便于维护。
// auth-interceptor.js
export function requestAuth(config) {
  config.headers.Auth = 'xxx';
  return config;
}

错误处理:统一在响应拦截器中处理错误。

axios.interceptors.response.use(null, err => {
  if (err.response.status === 401) {
    redirectToLogin();
  }
  return Promise.reject(err);
});
  1. 避免副作用:拦截器应保持纯净,避免修改外部状态。
  2. 取消拦截器:通过 eject 移除不必要的拦截器。
const interceptor = axios.interceptors.request.use(...);
axios.interceptors.request.eject(interceptor);

执行顺序示例

请求拦截器1 → 请求拦截器2 → 发送请求 → 响应拦截器1 → 响应拦截器2 → 最终结果

通过合理使用拦截器,可提升代码复用性,统一管理请求/响应逻辑,使代码更简洁易维护。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3828.html

分享给朋友:

“前端知识点-axios 的拦截器原理及应用,并简单手写核心逻辑” 的相关文章

如何做好精细化管理,实现全流程高效落地,牢记这4点

本文选自头条号@业绩增长系统???????????该资料?共有完整版42页,对于学习之人非常具有参考价值,值得深度学习精细化的费用管理是提升企业费效的必经之路,精细化管理”顾名思义就是“精确、细致、深入、规范”的全面管理模式领取方式:1、?关注?+评论+转发此文?2、主页S信?:999免费?获得?这...

Ubuntu 24.10发行版登场:Linux 6.11内核、GNOME 47桌面环境

IT之家 10 月 11 日消息,Canonical 昨日发布新闻稿,正式推出代号为 Oracular Oriole 的 Ubuntu 24.10 发行版。新版在内核方面升级到最新 6.11 版本,并采用 GNOME 47 桌面环境。Ubuntu 24.10 发行版调整了内核策略,开始选择最新的上游...

快速掌握 Git:程序员必会的版本控制技巧

在现代软件开发中,版本控制系统(VCS)是开发人员不可或缺的工具。无论是个人项目,还是多人协作的团队开发,良好的版本控制都能确保代码管理的高效性与稳定性。而在版本控制系统中,Git 凭借其分布式、灵活性和高效性,成为了最流行的工具之一。几乎所有的开发团队都在使用 Git 来管理代码版本、协作开发和追...

编码 10000 个小时后,开发者悟了:“不要急于发布!”

【CSDN 编者按】在软件开发的道路上,时间是最好的老师。根据“一万小时定律”,要成为某个领域的专家,通常需要大约一万小时的刻意练习。本文作者身为一名程序员,也经历了一万小时的编程,最终悟出了一个道理:慢即是快,重视架构设计和代码质量,确保每一行代码都经得起时间的考验。作者 | Sotiris Ko...

虚幻引擎5.5发布

IT之家 11 月 13 日消息,虚幻引擎 5.5 现已发布。据介绍,新版本虚幻引擎在动画创作、虚拟制作和移动游戏开发方面取得进步;渲染、摄像机内视觉特效和开发人员迭代等领域的部分功能已可用于生产。IT之家整理部分功能亮点如下:动画Sequencer增强虚幻引擎的非线性动画编辑器 Sequencer...

12种JavaScript中最常用的数组操作整理汇总

数组是最常见的数据结构之一,我们需要绝对自信地使用它。在这里,我将列出 JavaScript 中最重要的几个数组常用操作片段,包括数组长度、替换元素、去重以及许多其他内容。1、数组长度大多数人都知道可以像这样得到数组的长度:const arr = [1, 2, 3]; console.log(a...