手写axios源码系列三:dispatchRequest发送请求

news2024/11/19 0:26:53

文章目录

  • 一、dispatchRequest 发送请求代码设计思路
    • 1、创建 dispatchRequest.js 文件
    • 2、创建 adapters.js 文件
    • 3、创建 xhr.js 文件
    • 4、总结

在这里插入图片描述
上篇文章中介绍了创建 axios 函数对象的思路,在 Axios 的原型对象上声明了一个 request 方法,在 request 方法中调用了 dispatchRequest 用来发送请求。

现在,让我们来看看 dispatchRequest 发送请求的代码设计思路。

一、dispatchRequest 发送请求代码设计思路

1、创建 dispatchRequest.js 文件

import adapters from "./adapters.js";
import defaults from "./defaults.js";  // {adapter:["xhr","http"]}

export default function dispatchRequest(config){
	// 使用 adapters.getAdapter() 获取发送请求的方式 xhr或者 http
	const adapter = adapters.getAdapter(config.adapter || defaults.adapter);
	// 返回一个新的 promise对象
	return adapter(config).then(response => {
		// 返回响应数据
		return response;
	}, error => {
		throw new Error(error);
	})
}

2、创建 adapters.js 文件

import xhrAdapter from "./xhr.js";
// import httpAdapter from "./http.js";  // http为 nodejs支持发送的方式,此处不做讨论

// 此处维护一个已知适配器对象
const knownAdapters = {
	// http: httpAdapter,
	xhr: xhrAdapter
}
export default const adapters = {
	// 返回一个通信方式适配器
	getAdapter: (adapters) => {
		// 兼容性判断:是否为数组
		adapters = Array.isArray(adapters) ? adapters : [adapters];
		let adapter;
		// 获取 xhr 适配器
		for(let i = 0; i < adapters.length; i++){
			adapter = knownAdapters[adapters[i]];
			break;
		}
		// adapter 应为一个函数,否则抛出错误
		if (typeof adapter !== "function"){ 
			throw new TypeError('adapter is not a function');
		}
		return adapter;
	}
}

3、创建 xhr.js 文件

使用 XMLHttpRequest 创建一个 AJAX 请求函数,因为在 dispatchRequest.js 中使用 promise.then(),所以需要返回一个 promise 对象。

以下是一个创建 AJAX 请求的函数 xhrAdapter

export default function xhrAdapter(config){
	// 返回一个 promise对象
	return new Promise((resolve, reject) => {
		// 创建一个xhr对象
		const request = new XMLHttpRequest();
		// 请求资源的地址以及方法,true为异步方式,也是默认方式,可省略
		request.open(config.url, config.method, true);
		// 判断请求状态
		request.onreadystatechange = function(){
			if (request.readyState === 4){
				if (request.status >= 200 && request.status < 300){
					// 反序列化(将响应数据从字符串转换为对象)
					const responseData = JSON.parse(request.responseText)
					// 结构化最终结果
					const response = {
						data: responseData, 						// 响应体
						status: request.status, 					// 响应状态
						statusText: request.statusText,				// 响应状态描述
						headers: request.getAllResponseHeaders(),	// 响应头
						config,  									// 配置项
						request  									// xhr请求对象
					}
					// 返回最终结果
					resolve(response)
				} else {
					// 响应状态不为 2xx 时,报错
					reject(new Error(`请求失败!状态码为${request.status}`))
				}
			}
		}
		// 发送请求
		request.send(config.data || null);
	})
}

4、总结

dispatchRequest 这里的代码逻辑还是比较简单,比较清晰的。

用一张图来表示可能更直观一些:

在这里插入图片描述

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

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

相关文章

基于Java+Springboot+vue在线版权登记管理系统设计实现

基于JavaSpringbootvue在线版权登记管理系统设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文…

亚马逊云科技在上云旅程中不断调整和优化成本管理计划

亚马逊云科技的云财务管理旨在帮助企业建立一个成功的CFM战略&#xff1a;通过4个云财务管理CFM原则或步骤作为路线图&#xff1a;SEE-查看、SAVE-保存、PLAN-计划和RUN-运行。 对现有工作负载的预测和规划 1、 优化计算资源与架构&#xff1a; 与技术业务相关部门合作&…

Notion打不开

如果Notion打不开&#xff0c;可以尝试以下方法&#xff1a;1. 尝试Ping一下Notion的服务器&#xff0c;如果是正常的&#xff0c;但访问502了&#xff0c;那么很可能是DNS污染了。建议将DNS修改为114.114.114.114&#xff0c;再加个8.8.8.8&#xff0c;修改完成后再度访问Noti…

doccano使用记录

参考文章&#xff1a;https://github.com/PaddlePaddle/PaddleNLP/blob/develop/model_zoo/uie/doccano.md 参考文章&#xff1a;https://github.com/doccano/doccano 参考文章&#xff1a;https://doccano.github.io/doccano/ 参考文章&#xff1a;https://zhuanlan.zhihu.com…

06 | 立迈胜电机使用问题汇总

1 前提 使用STM2832B-485-MA-0FS等 2 常见问题 2.1 操作相关 问题1&#xff1a;怎么识别到电机设备 解决方法&#xff1a; 1、电机上电&#xff0c;在通讯处&#xff0c;点击【打开】 2、设备类型选择【串口】 3、选择串口选择【对应的COM】 4、选择对应的波特率 问题2…

python 的 object 与type的关系

python 的 object 与type的关系 是并列关系&#xff0c;两种是相互依赖的 查询父类 type.__bases__ object.__bases__(<class ‘object’>,) () 查询类型 type(type) type(object)<class ‘type’> <class ‘type’> 在python中&#xff0c;type用于描述…

Docker之Docker网络

Docker网络 1. 理解Docker01.1 测试1.2 原理1.3 小结 2. -link3. 自定义网络3.1 网络模式3.2 测试3.3 自定义网络 4. 网络连通5. 实战&#xff1a;部署Redis集群6. 总结 1. 理解Docker0 清空所有环境 docker rm -f $(docker ps -aq) docker rmi -f $(docker images -aq)1.1 测…

51.现有移动端开源框架及其特点—PocketFlow-1

51.1 简介 全球首个自动模型压缩框架一款面向移动端AI开发者的自动模型压缩框架,集成了当前主流的模型压缩与训练算法,结合自研超参数优化组件实现了全程自动化托管式的模型压缩与加速。 开发者无需了解具体算法细节,即可快速地将AI技术部署到移动端产品上,实现了自动托管式…

Java项目打包exe运行文件

Java项目打包exe运行文件 JavaSE打包成exe运行文件的方法有很多种&#xff0c;此处我们主要讲解我常用的一种exe4j&#xff0c;打包前我们需要先安装exe4j这个工具。 注意&#xff1a;exe4j仅支持最低JDK1.8最高JDK11&#xff0c;所以在安装之前一定要查看自己的JDK版本&#…

银行数字化转型导师坚鹏:数字化时代普惠金融模式和产品创新

数字化时代普惠金融模式和产品创新 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚普惠金融的机遇与挑战&#xff1f; 不知道普惠金融模式和产品如何创新&#xff1f; 不知道普惠金融产品创新的成功案例&#xff1f; 课程特色&#xff1a; 用实战案例…

使用Docker安装Zookpeer集群

1&#xff09;需要提前安装python和docker-compose 注&#xff1a;sudo权限看自己机器的权限 安装python-pip&#xff1a;sudo yum -y install epel-releasesudo yum -y install python-pip安装docker-compose&#xff1a;sudo pip install docker-compose 注意在安装过程中很…

FileZilla密钥登录

使用密码登录非常的方便&#xff0c;但是有的客户的云服务器上是限定只能通过密钥登录。我一般使用命令行的scp命令就可以正常上传&#xff0c;但是对于我一些同事来说&#xff0c;就很不方便。 生成密钥 这个不难&#xff0c;可以参考我之前的文章。 《Mac使用ssh连接远程服…

实验07:子集和问题

1.实验目的&#xff1a; 深刻理解回溯法的基本思想&#xff0c;掌握回溯法解决问题的一般步骤&#xff0c;学会使用回溯法解决实际问题.运用所熟悉的编程工具&#xff0c;借助回溯法的思想求解子集和数的问题。 2.实验内容&#xff1a; 给定 n n n 个正整数 { x 1 , x 2 ,…

springboot 接口防刷(根据IP与路径限制)

接口防刷 一、全局接口防刷&#xff08;通过拦截器方式&#xff09;1、原理 代码示例 二、个别接口防刷&#xff08;接口注解方式)1、代码示例 一、全局接口防刷&#xff08;通过拦截器方式&#xff09; 1、原理 代码示例 通过ip地址uri拼接用以作为访问者访问接口区分通过…

NX状态检测

输入 sudo -H pip install jetson-stats 如果提示没有pip&#xff0c;那么就输入 sudo apt-get install python-pip 之后输入 sudo jtop进行监测 用这个方法可以看到当前Jetpack的版本

记录 Vite 报错 process is not defined 报错问题

由于导入别人开发好的插件&#xff0c;在开发的时候报了process is not defined的错误&#xff0c;记录一下解决方式&#xff0c;方便后续使用。 1.查看里面具体的报错信息是找不到process这个问题。 原因&#xff1a; process.env 已经被遗弃&#xff08;我个人查询百度&…

lwip - 链路层收发以太网数据帧

1、以太网帧结构 数据包在以太网物理介质上传播之前必须封装头部和尾部信息。封装后的数据包称为数据帧&#xff0c;数据帧的封装的信息决定了数据如何传输。   以太网中传输的帧有两种格式&#xff0c;IEEE 802.3 和 Ethernet II&#xff0c;选择哪种格式由TCP/IP协议簇中的…

光伏太阳能直流浪涌保护器应用方案

由于用于光伏装置的直流电涌保护设备必须设计为完全暴露在阳光下&#xff0c;因此它们极易受到雷电的影响。光伏阵列的容量与其暴露的表面积直接相关&#xff0c;因此闪电事件的潜在影响随着系统规模的增加而增加。在照明频繁发生的情况下&#xff0c;未受保护的光伏系统可能会…

pytorch中BatchNorm2d的实验验证

BatchNorm2d 对二维矩阵进行批量归一化&#xff0c;mean为当前batch的均值&#xff0c;std为当前batch的标准差&#xff0c;使用批量归一化能够将取值范围不同的数据映射到标准正态分布的区间中&#xff0c;减少数据之间的差距&#xff0c;方便模型快速收敛。批量归一化本质上…

Vivado增量编译:加速FPGA设计实现的利器

随着FPGA设计的复杂度不断提高&#xff0c;设计人员需要选择更为高效的设计流程来保证开发效率和减少开发成本。其中&#xff0c;Vivado增量编译是一种非常重要的设计流程。本文将介绍Vivado增量编译的基本概念、优点、使用方法以及注意事项。 通过阅读本文可以了解&#xff1…