• axios从入门到源码分析之axios 源码分析(二)


    ⭐️⭐️⭐️  作者:船长在船上
    🚩🚩🚩  主页:来访地址船长在船上的博客
    🔨🔨🔨  简介:资深前端开发工程师,专注前端开发,欢迎咨询交流,共同学习

    🔔🔔🔔   感谢:如果觉得博主的文章不错或者对你的工作有帮助或者解决了你的问题,可以关注、支持一下博主,如果三连收藏支持就会更好,在这里博主不胜感激!!!如有疑问可以留言、评论,看到后会及时回复。  

    axios从入门到源码分析 

    2 章:axios 源码分析 

    2.1. 源码目录结构

    ├── /dist/ # 项目输出目录
    ├── /lib/ # 项目源码目录
    │ ├── /adapters/ # 定义请求的适配器 xhr http
    │ │ ├── http.js # 实现 http 适配器 ( 包装 http )
    │ │ └── xhr.js # 实现 xhr 适配器 ( 包装 xhr 对象 )
    │ ├── /cancel/ # 定义取消功能
    │ ├── /core/ # 一些核心功能
    │ │ ├── Axios.js # axios 的核心主类
    │ │ ├── dispatchRequest.js # 用来调用 http 请求适配器方法发送请求的函数
    │ │ ├── InterceptorManager.js # 拦截器的管理器
    │ │ └── settle.js # 根据 http 响应状态,改变 Promise 的状态
    │ ├── /helpers/ # 一些辅助方法
    │ ├── axios.js # 对外暴露接口
    │ ├── defaults.js # axios 的默认配置
    │ └── utils.js # 公用工具
    ├── package.json # 项目信息
    ├── index.d.ts # 配置 TypeScript 的声明文件
    └── index.js # 入口文件

    2.2. 源码分析

    2.2.1. axios Axios 的关系 ?

    1. 从语法上来说: axios 不是 Axios 的实例

    2. 从功能上来说: axios Axios 的实例

    3. axios Axios.prototype.request 函数 bind()返回的函数

    4. axios 作为对象有 Axios 原型对象上的所有方法, Axios 对象上所有属性

    2.2.2. instance axios 的区别?  

    1. 相同:

    (1) 都是一个能发任意请求的函数: request(config)

    (2) 都有发特定请求的各种方法: get()/post()/put()/delete()

    (3) 都有默认配置和拦截器的属性: defaults/interceptors

    2. 不同:

    (1) 默认配置很可能不一样

    (2) instance 没有 axios 后面添加的一些方法: create()/CancelToken()/all()

    2.2.3. axios 运行的整体流程?  

     

    1. 整体流程:

    request(config) ==> dispatchRequest(config) ==> xhrAdapter(config)

    2. request(config):

    将请求拦截器 / dispatchRequest() / 响应拦截器 通过 promise 链串连起来,

    返回 promise

    3. dispatchRequest(config):

    转换请求数据 ===> 调用 xhrAdapter()发请求 ===> 请求返回后转换响应数

    . 返回 promise

    4. xhrAdapter(config):

    创建 XHR 对象, 根据 config 进行相应设置, 发送特定请求, 并接收响应数据,

    返回 promise

     

    2.2.4. axios 的请求/响应拦截器是什么? 

     

    1. 请求拦截器:

    • 在真正发送请求前执行的回调函数
    • 可以对请求进行检查或配置进行特定处理
    • 成功的回调函数, 传递的默认是 config(也必须是)
    • 失败的回调函数, 传递的默认是 error

    2. 响应拦截器

    • 在请求得到响应后执行的回调函数
    • 可以对响应数据进行特定处理
    • 成功的回调函数, 传递的默认是 response
    • 失败的回调函数, 传递的默认是 error

     

    2.2.5. axios 的请求/响应数据转换器是什么? 

    1. 请求转换器: 对请求头和请求体数据进行特定处理的函数

    if (utils.isObject(data)) {

    setContentTypeIfUnset(headers, 'application/json;charset=utf-8');

    return JSON.stringify(data);

    }

    2. 响应转换器: 将响应体 json 字符串解析为 js 对象或数组的函数

    response.data = JSON.parse(response.data)

    2.2.6. response 的整体结构

    {

    data,

    status,

    statusText,

    headers,

    config,

    request

    }

    2.2.7. error 的整体结构 

    {

    message,

    response,

    request,

    }

    2.2.8. 如何取消未完成的请求?  

    1. 当配置了 cancelToken 对象时, 保存 cancel 函数

    (1) 创建一个用于将来中断请求的 cancelPromise

    (2) 并定义了一个用于取消请求的 cancel 函数

    (3) cancel 函数传递出来

    2. 调用 cancel()取消请求

    (1) 执行 cacel 函数, 传入错误信息 message

    (2) 内部会让 cancelPromise 变为成功, 且成功的值为一个 Cancel 对象

    (3) cancelPromise 的成功回调中中断请求, 并让发请求的 proimse 失败,

    失败的 reason Cancel 对象

    上一篇文章:

     

       👉👉👉  欢迎来访船长在船上的博客,如有疑问可以留言、评论,看到后会及时回复。   
  • 相关阅读:
    Codeforces Round #830 (Div. 2) D1. Balance (Easy version)
    【Python3】【力扣题】231. 2 的幂
    武汉市技术转移示范机构绩效考核对象、内容和申报流程、材料
    第16篇:JTAG UART IP应用<三>
    【基础建设】浅谈企业网络安全运营体系建设
    Android dumpsys 常用命令
    TypeScript的安装与简单使用(第一篇)
    详解:指针和指针类型
    LeetCode 961. N-Repeated Element in Size 2N Array
    会议管理系统SSM记录(二)
  • 原文地址:https://blog.csdn.net/SmartJunTao/article/details/126279054