手写axios源码系列二:创建axios函数对象

news2024/12/23 4:57:11

文章目录

  • 一、模块化目录介绍
  • 二、创建 axios 函数对象
    • 1、创建 axios.js 文件
    • 2、创建 defaults.js 文件
    • 3、创建 _Axios.js 文件
    • 4、总结

在这里插入图片描述
当前篇章正式进入手写 axios 源码系列,我们要真枪实弹的开始写代码了。

因为 axios 源码的代码量比较庞大,所以我们这里只抓主线,让大家对 axios 的主要核心功能有个大概了解,至于具体的细节深入,需要大家去通读 axios 源码了解。手写 axios 源码系列只将其中的4个主要功能模块进行了手写,就是在上篇文章: 手写axios源码系列一:axios核心知识点 中介绍的四个核心功能点:

  1. axios 函数对象
  2. dispatchRequest 发送请求
  3. interceptors 拦截器
  4. cancelToken 取消请求

一、模块化目录介绍

建议大家先下载 axios 的源码,然后过一遍源码的目录文件,主要文件全部在 lib 目录下,这里我就不一一介绍了。

在这里插入图片描述


接下来看一下我手写 axios 源码所创建的目录介绍(文件名称依据源码文件名称命名):

在这里插入图片描述

  • _Axios.js:axios的构造函数,因为有一个 axios.js,文件名不区分大小写会重复,所以添加了下横杠 _Axios 防止文件名重复;其中 request 方法为重点,拦截器功能在这里书写;
  • adapters.js:适配器,其中有一个方法 getAdapter 来获取发送请求的方式 xhr 或者 http ;
  • axios.js:整个目录的入口文件,创建了axios 函数对象以及对外暴露了一些属性以及方法;
  • CancelToken:取消请求的功能代码;
  • defaults.js:默认配置项(预配置);
  • dispatchRequest.js:真正发送请求以及接收响应数据的文件目录;
  • index.html:手写axios源码的测试代码,测试一下自己写的代码是否正确;
  • InterceptorManager:拦截器的构造函数;
  • xhr.js:书写 AJAX(Asynchronous Javascript And XML) 代码的文件目录。

二、创建 axios 函数对象

1、创建 axios.js 文件

import Axios from "./_Axios.js";
import defaults from "./defaults.js";
import CancelToken from "./CancelToken";

// 初始化 axios 函数对象
function createInstance(defaultConfig){
	// 生成 _Aixos 的实例对象
	const context = new Axios(defaultConfig);
	// 生成 instance 绑定函数,并且绑定 this 为 context,防止调用时 this 指向不明
	const instance = Axios.prototype.request.bind(context, ...arguments);
	// 将 context 实例对象的属性复制到 instance 上
	Object.keys(context).forEach(key=>{
		instance[key] = context[key]
	})
	// 将 Axios 原型对象的属性复制到 instance 上
	Object.keys(Axios.prototype).forEach(key=>{
		instance[key] = Axios.prototype[key]
	})
	// axios.create 方法
	instance.create = function(instanceConfig){
		const mergeConfig = {
			...defaultConfig,
			...instanceConfig
		}
		return createInstance(mergeConfig);
	}
	// instance 就是 axios
	return instance;
}
// 创建 axios 函数对象
const axios = createInstance(defaults);
// 对外暴露 CancelToken 类,取消请求时使用
axios.CancelToken = CancelToken;
// 导出 axios
export default axios;

2、创建 defaults.js 文件

export default {
	// 适配器的默认配置,写适配器 adapters 代码时需要传入的配置
	adapter: ['xhr', 'http']
}

3、创建 _Axios.js 文件

import InterceptorManager from "./IntercptorManager.js";
import dispatchRequest from "./dispatchRequest.js";

export default class Axios {
	constructor(config){
		// 实例对象的 defaults属性(默认配置对象)
		this.defaults = config;
		// 实例对象的 interceptors属性(拦截器)
		this.interceptors = {
			request: new InterceptorManager(),
			response: new InterceptorManager()
		}
	}
	// request 发送请求
	request(configOrUrl, config){
		if(typeof configOrUrl === "string"){
			config.url = configOrUrl
		} else {
			config = {
				...configOrUrl,
				...config
			}
		}
		// 将 config包装为一个 promise对象
		let promise = Promise.resolve(config);
		// 创建执行链,这里调用 dispatchRequest方法以发送请求
		const chain = [dispatchRequest, undefined];
		// 调用 promise.then()将 config传入 dispatchRequest中,dispatchRequest中返回的也是一个 prommise对象
		promise = promise.then(chain[0], chain[1]);
		// 发送请求后返回的是一个 promise对象
		return promise;
	}
}
const methodsWithNoData = ["delete", "get", "head", "options"];
const methodsWithData = ["post", "put", "patch"];
// 给 Axios的原型对象添加请求方法
methodsWithNoData.forEach(method => {
	Axios.prototype[method] = function(url, config){
		config = {
			...config,
			method,
			url
		}
		// 最后返回 request生成的 promise对象
		return this.request(config)
	}
})
methodsWithData.forEach(method => {
	Axios.prototype[method] = function(url, data, config){
		config = {
			...config,
			method,
			url,
			data
		}
		return this.request(config)
	}
})

4、总结

以上代码包含了 axios 函数对象的创建过程:

  1. 使用 createInstance() 生成 axios 函数对象
    • 先实例化对象 context,然后使用 Axios.prototype.request 方法 bind 一个新函数 instance,调用 instance() 就相当于调用 Axios.prototype.request()
    • 生成的新函数 instance 没有任何属性以及方法可以使用,所以将 context 以及 Axios.prototype 上的属性以及方法复制给 instance 使用;
    • 挂载一个 create 方法,供 axios 封装使用,调用 create() 方法其实就是调用 createInstance() 方法。
  2. 为 axios 挂载其他属性,对外暴露以供使用。
  3. 导出 axios 函数对象。

下篇文章我们着重讲解发送请求 dispatchRequest 以及适配器 adapters

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/450782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xilinx FPGA下如何加快QSPI Flash加载速度

1. 首先,不同型号的FPGA对外部QSPI Flash支持的最高频率是不一样的。XC6SLX45支持的最高频率仅为26MHz, 而XC7K325T支持的最高频率高达66MHz。 所以,当我们添加 set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design] 的时候&…

特征选择算法 | Matlab实现基于互信息特征选择算法的分类数据特征选择 MI

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 特征选择算法 | Matlab实现基于互信息特征选择算法的分类数据特征选择 MI 部分源码 %

【1105. 填充书架】

来源:力扣(LeetCode) 描述: 给定一个数组 books ,其中 books[i] [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。 按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。 先…

题目3180:蓝桥杯2023年第十四届省赛真题-互质数的个数======及探讨互质专题

原题链接 https://www.dotcpp.com/oj/problem3162.html 想直接看题解的,跳转到第三次尝试即可。 已AC。 解析: (1)首先大家要知道什么叫互质: 以及它们的性质: 欧拉函数 在数论中,对正整…

世界读书日|这些值得程序员反复阅读的经典书

2023年是第28个世界读书日,每年的这个时候,小编都会准备一份书单与您分享。 与经典同行,伴书香成长。小编今天推荐一份值得程序员反复阅读的经典书。 1、浪潮之巅 第四版 这不只是一部科技产业发展历史集…… 更是在这个智能时代&#xff…

【远程工具】- MobaXterm 的下载、安装、使用、配置【Telnet/ssh/Serial】

一、MobaXterm 概述 在远程终端工具中,secureCrt 和 XShell 是两款比较有名的远程工具,但这两款软件现在都是收费的,有些公司不允许破解使用。今天就推荐一款免费的、免安装的、功能丰富的远程终端软件–MobaXterm。 MobaXterm是由Mobatek开…

JavaScript概述三(循环结构+BOM浏览器对象模型+JSON对象)

1.循环结构 1.1 普通循环(for循环,while循环,do……while循环) JavaScript中的普通循环和Java中的普通循环基本类似&#xff0c;此处以for循环为例&#xff0c;while和do……while便不再赘述。 <script type"text/javascript">var ary1new Array(1,false,嘿嘿…

Redis队列Stream、Redis多线程详解(三)

Redis中的线程和IO模型 什么是Reactor模式 &#xff1f; “反应”器名字中”反应“的由来&#xff1a; “反应”即“倒置”&#xff0c;“控制逆转”,具体事件处理程序不调用反应器&#xff0c;而向反应器注册一个事件处理器&#xff0c;表示自己对某些事件感兴趣&#xff0…

CTA进网测试《5G消息 终端测试方法》标准依据:YDT 3958-2021

GB 21288-2022 强制国标要求变化​ 与GB 21288-2007相比&#xff0c; 新国标主要有以下变化&#xff1a; 1. 增加职业暴露定义&#xff1a; 2. 增加吸收功率密度定义&#xff1a; 3. 增加不同频率、不同人体部位适用的暴露限值&#xff1a; 4. 增加产品说明书的注释&#xff1a…

ArcGIS Pro用户界面

目录 1 功能区 1.1 快速访问工具栏 1.2 自定义快速访问工具栏 1.3 自定义功能区选项 1.3.1 添加组和命令 1.3.2 添加新选项卡 2 视图 3 用户界面排列 ​编辑 4 窗格 4.1 内容窗格 4.2 目录窗格 4.3 目录视图&#xff08;类似ArcCatalog&#xff09; 4.4 浏览对话框…

注册表取证

目录 操作系统安装时间 计算机名称 本地用户 最后登录的用户 当前登录用户 U盘序列号 USB挂载的盘符 卷标名称 安装的程序 ​编辑卸载的程序 最近使用的文件 最近运行的命令行 操作系统安装时间 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion…

无需代码!新人可操作!分享20个可视化大屏(内附下载)

做前端开发的各位&#xff0c;大都知晓老板钟爱的可视化大屏—清晰、便捷、撑排面&#xff0c;轻轻松松打破数据孤岛等一系列问题。我真的深有体会&#xff0c;前些天&#xff0c;老板去人家公司开会&#xff0c;回来就把这大屏安排上了。之前就认为大屏也不过是面子工程&#…

03 - 大学生如何使用GPT

大学生如何使用GPT提高学习效率 一、引言 在当今的高速发展的信息时代&#xff0c;大学生面临着越来越多的学习挑战。作为一种先进的人工智能技术&#xff0c;GPT为大学生提供了一种强大的学习工具。本文将介绍大学生在不同场景中如何使用GPT来提高学习效率&#xff0c;并给出…

「区间DP-步入」凸多边形的划分

凸多边形的划分 题目描述 给定一个具有N个顶点的凸多边形&#xff0c;将顶点从1至N标号&#xff0c;每个顶点的权值都是一个正整数。将这个凸多边形划分成N-2个互不相交的三角形&#xff0c;试求这些三角形顶点的权值乘积和至少为多少。 输入描述 输入第一行为顶点数N第二行…

云智慧陆兴海:统一运维体系为数字政府建设保驾护航

2023年4月6日至7日&#xff0c;由长春市人民政府、吉林省政务服务和数字化建设管理局主办的《2023长春数字经济发展论坛》在长春隆重举行。 本次论坛旨在探讨数字经济的理论创新、实践探索和发展路径&#xff0c;推动长春市乃至吉林省的数字化转型和高质量发展。第十二届全国政…

无源滤波器为什么能滤波?

滤波器能够滤波的本质是利用构造特定的阻抗特性引起反射和损耗来实现对频率的选择。 如果从能量守恒的角度来讲&#xff0c;被抑制掉的信号去哪里了&#xff1f;​ 我们先看一下基本电路原理&#xff0c;上图中&#xff0c;负载接收的功率为 我们知道&#xff0c;最大功率传输…

ChatGPT: 从GPT-3.5到GPT-4,探索语言模型的演进之路

ChatGPT: 从GPT-3.5到GPT-4&#xff0c;探索语言模型的演进之路 引言 人工智能语言模型的演进 随着人工智能的快速发展&#xff0c;语言模型作为自然语言处理领域的一项重要技术也在不断演进。从最初的基于规则的系统&#xff0c;到基于统计的模型&#xff0c;再到近年来的深度…

【Scala入门】scala基础语法:to和until,if-else和for循环,while循环

目录&#xff1a; 【Scala入门】Scala下载及安装&#xff08;Windows&#xff09;以及Idea创建第一个scala项目_水w的博客-CSDN博客 【Scala入门】scala基础语法&#xff1a;类和对象&#xff0c;变量和常量_水w的博客-CSDN博客 目录 2.4 数据类型 2.5 to和until&#xff0c;…

破防了,这才是机房运维的高效方法

在云计算、5G等新业务野蛮生长的催化下&#xff0c;机房规模与容量也呈倍速扩张。机房安全是业务发展的底座。提升机房设备安全和管理效率&#xff0c;避免人为因素导致的事故发生&#xff0c;是机房运维的必要前提。 安全生产重于泰山&#xff0c;除了日常的科学防护&#xf…

C++函数适配器和函数包装器:让你的函数更灵活

&#x1f4d6;作者介绍&#xff1a;22级树莓人&#xff08;计算机专业&#xff09;&#xff0c;热爱编程&#xff1c;目前在c&#xff0b;&#xff0b;阶段>——目标Windows&#xff0c;MySQL&#xff0c;Qt&#xff0c;数据结构与算法&#xff0c;Linux&#xff0c;多线程&…