9.axios底层原理,和promise的对比(2)

😺😺😺 和promise的对比
完全可以直接使用 Promise 来发 HTTP 请求,比如用原生 fetch + Promise 就可以实现网络请求功能👇

✅ 用 Promise + fetch 的写法(原生)

fetch(‘https://api.example.com/data’)
.then(response => {
if (!response.ok) {
throw new Error(‘网络请求失败’);
}
return response.json();
})
.then(data => {
console.log(‘获取到的数据:’, data);
})
.catch(error => {
console.error(‘出错了:’, error);
});

或者配合 async/await:

async function getData() {
try {
const res = await fetch(‘https://api.example.com/data’);
const data = await res.json();
console.log(data);
} catch (err) {
console.error(‘请求失败:’, err);
}
}

❓那为什么还要用 Axios?

你可以把 Axios 理解为在 Promise 的基础上,做了很多贴心的“增强封装”,避免你自己重复造轮子,比如

✅ 小结一句话
完全可以用Promise 来发 HTTP 请求,比如用原生 fetch + Promise 就可以实现网络请求功能👇

✅ 用 Promise + fetch 的写法(原生)

fetch(‘https://api.example.com/data’)
.then(response => {
if (!response.ok) {
throw new Error(‘网络请求失败’);
}
return response.json();
})
.then(data => {
console.log(‘获取到的数据:’, data);
})
.catch(error => {
console.error(‘出错了:’, error);
});

或者配合 async/await:

async function getData() {
try {
const res = await fetch(‘https://api.example.com/data’);
const data = await res.json();
console.log(data);
} catch (err) {
console.error(‘请求失败:’, err);
}
}

❓那为什么还要用 Axios?

你可以把 Axios 理解为在 Promise 的基础上,做了很多贴心的“增强封装”,避免你自己重复造轮子,比如

在这里插入图片描述

✅ 小结一句话

Promise 是底层机制;fetch 是浏览器原生 API;Axios 是基于 Promise 的高级封装,帮你做了更多重复性的工作。

所以结论是:
• ✅ 想极简 + 自己控制逻辑:可以直接用 fetch + Promise
• 🚀 想方便 + 拦截器 + 项目统一封装:推荐用 Axios

😺😺😺 aixos的底层原理
lAxios 的底层原理,可以把它理解为一层「统一的网络请求封装」,根据运行环境自动调用不同的底层实现。

✅ 一句话概括:

Axios 是一个对浏览器的 XMLHttpRequest 和 Node.js 的 http 模块的封装,并结合了 Promise、拦截器、中间件机制等高级功能的请求库。

🧩 Axios 底层原理详解(按执行流程讲)

  1. 运行环境判断

Axios 的代码是通用的,在构建时自动根据环境(浏览器 vs Node)使用不同适配器:

// 源码片段
var getDefaultAdapter = function getDefaultAdapter() {
if (typeof XMLHttpRequest !== ‘undefined’) {
return require(’./adapters/xhr’); // 浏览器环境
} else if (typeof process !== ‘undefined’) {
return require(’./adapters/http’); // Node.js 环境
}
};

  1. 核心结构:axios 实例本质是一个函数 + 配置链式调用系统

Axios 是通过 axios.create() 创建一个带默认配置的实例,其实本质是一个函数对象,并带有拦截器、请求方法(get/post/put…)等属性。

const axios = Axios.create();
axios.get(’/url’) // 就是在调用实例对象的方法

  1. 请求发送:根据环境走不同适配器

👉 浏览器中

使用的是 XMLHttpRequest

const xhr = new XMLHttpRequest();
xhr.open(method, url);
xhr.send(data);

👉 Node.js 中

使用的是 http 或 https 模块

const http = require(‘http’);
const req = http.request(options, res => {
// 处理响应
});
req.write(data);
req.end();

  1. 请求流程组成(重点)

用户调用 axios(config)

合并默认配置 + 用户配置

执行请求拦截器链(request interceptors)

调用适配器(xhr / http)发出请求

获取响应后执行响应拦截器链(response interceptors)

返回 Promise 给调用者

  1. 拦截器机制(interceptors)

Axios 内部实现了一个 链式中间件系统,用来处理拦截器。

你添加的拦截器会被加入到一条“任务链”中执行,先执行 request 拦截器,再发请求,之后执行 response 拦截器:

interceptors.request.use(fn1);
interceptors.request.use(fn2); // 执行顺序:fn1 → fn2

  1. Promise 化封装

Axios 所有操作都是 Promise 化的,便于使用 async/await,也方便链式 .then() 调用。

return new Promise((resolve, reject) => {
xhr.onload = () => resolve(response);
xhr.onerror = () => reject(error);
});

🧠 总结一句话:

Axios 底层是通过环境适配调用 XHR 或 Node 的 HTTP 模块,外部暴露统一的 Promise 风格 API,并通过“拦截器链”实现请求和响应逻辑的可扩展性。

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

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

相关文章

什么是数据孤岛?如何实现从数据孤岛到数据共享?

目录 一、数据孤岛是什么? (一)数据孤岛的定义 (二)数据孤岛怎么形成的 二、数据孤岛带来的问题 (一)数据冗余和不一致 (二)决策效率低下 (三&#xf…

MQTT入门实战宝典:从零起步掌握物联网核心通信协议

MQTT入门实战宝典:从零起步掌握物联网核心通信协议 前言 物联网时代,万物互联已成为现实,而MQTT协议作为这个时代的"数据总线",正默默支撑着从智能家居到工业物联的各类应用场景。本文将带你揭开MQTT的神秘面纱&#…

I2C通信讲解

I2C总线发展史 怎么在一条串口线上连接多个设备呢? 由于速度同步线是由主机实时发出的,所以主机可以按需求修改通信速度,这样在一条线上可以挂接不同速度的器件,单片机和性能差的器件通信,就输出较慢的脉冲信号&#x…

Windows 10 IoT 系统深度定制指南:从环境搭建到工业部署

目录 一、Windows 10 IoT 架构特性与版本选型 1.1 核心架构设计 1.2 版本对比与选型建议 二、开发环境搭建与硬件适配 2.1 工具链配置 2.2 硬件适配关键步骤 三、系统定制流程详解 3.1 镜像定制(IoT Core Dashboard) 3.2 使用ICD(Im…

k8s开发webhook使用certmanager生成证书

1.创建 Issuer apiVersion: cert-manager.io/v1 kind: Issuer metadata:name: selfsigned-issuernamespace: default spec:selfSigned: {}2.Certificate(自动生成 TLS 证书) apiVersion: cert-manager.io/v1 kind: Certificate metadata:name: webhook…

MyBatis-Plus深度全解:从入门到企业级实战

MyBatis-Plus深度全解:从入门到企业级实战 一、为什么选择MyBatis-Plus? 1.1 MyBatis的痛点 - 重复CRUD代码编写 - 分页功能实现复杂 - 缺少通用Service层封装 - 动态表名支持困难 - 多租户方案需自行实现1.2 MyBatis-Plus核心优势 无侵入&#xff1a…

【无标题】路径着色问题的革命性重构:拓扑色动力学模型下的超越与升华

路径着色问题的革命性重构:拓扑色动力学模型下的超越与升华 一、以色列路径着色模型的根本局限 mermaid graph TB A[以色列路径着色模型] --> B[强连通约束] A --> C[仅实边三角剖分] A --> D[静态色彩分配] B --> E[无法描述非相邻关系] C --> F[忽…

01 Deep learning神经网络的编程基础 二分类--吴恩达

二分类 1. 核心定义 二分类任务是监督学习中最基础的问题类型,其目标是将样本划分为两个互斥类别。设样本特征空间为 X ⊆ R n \mathcal{X} \subseteq \mathbb{R}^n X⊆Rn,输出空间为 Y { 0 , 1 } \mathcal{Y} \{0,1\} Y{0,1},学习目标为…

数据结构:递归:泰勒展开式(Taylor Series Expansion)

目录 第一步:❓我们要解决什么? 第二步:将其类比为求自然数和 第三步:什么是每一项? 第四步:定义要计算的每一项(term) 第五步:定义递归函数结构 🌳 调用…

Hadolint:Dockerfile 语法检查与最佳实践验证的终极工具

在容器化应用开发的浪潮中,Dockerfile 作为构建 Docker 镜像的核心配置文件,其质量直接影响着应用的安全性、稳定性和可维护性。然而,随着项目复杂度的增加,手动检查 Dockerfile 不仅耗时,还容易遗漏潜在问题。今天,我要向大家介绍一款强大的工具——Hadolint,它将彻底改…

redis数据过期策略、淘汰策略

过期键的删除策略​ ​​1. 被动删除(惰性删除)​​ ​​触发时机​​:当客户端尝试访问某个键时,Redis会先检查该键是否过期。就是说,我们不时时检查每个键是否过期,而是在使用到这个键时检查是否过期&a…

ES 学习总结一 基础内容

ElasticSearch学习 一、 初识ES1、 认识与安装2、 倒排索引2.1 正向索引2.2 倒排索引 3、 基本概念3.1 文档和字段3.2 索引和倒排 4 、 IK分词器 二、 操作1、 mapping 映射属性2、 索引库增删改查3、 文档的增删改查3.1 新增文档3.2 查询文档3.3 删除文档3.4 修改文档3.5 批处…

鸿蒙任务项设置案例实战

目录 案例效果 资源文件与初始化 string.json color.json CommonConstant 添加任务 首页组件 任务列表初始化 任务列表视图 任务编辑页 添加跳转 任务目标设置模型(formatParams) 编辑页面 详情页 任务编辑列表项 目标设置展示 引入目标…

DeepSeek-R1-0528重磅升级:三大突破重新定义AI生产力

2025年5月28日,中国AI领军企业深度求索(DeepSeek)正式发布DeepSeek-R1-0528版本,这是继2025年1月R1模型登顶中美App Store后,DeepSeek在通用大模型领域的又一次战略级突破。此次升级虽为小版本迭代,却在推理…

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …

中国西部逐日1 km全天候地表温度数据集(TRIMS LST-TP;2000-2024)

时间分辨率&#xff1a;日空间分辨率&#xff1a;100m - 1km共享方式&#xff1a;开放获取数据大小&#xff1a;474.31 GB数据时间范围&#xff1a;2000-01-01 — 2024-12-31元数据更新时间&#xff1a;2025-05-31 数据集摘要 青藏高原是全球气候变化的敏感区域。地表温度&…

PPT转图片拼贴工具 v1.0

软件介绍 这个软件的作用就是将单个PPT的每一页转换为单独的图片&#xff0c;然后将图片进行拼接起来。 但是我没有还没有解决一次性处理多个文件。 效果展示如下&#xff1a; 软件安装 软件源码 import os import re import win32com.client from PIL import Imagedef con…

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…

抛砖引玉:RadarDet4D,NuScenes数据集Radar模态目标检测第二名(即将开源)

这几年一直在关注自动驾驶3D目标检测相关的研究。在NuScenes数据集上有很多经典的模型被提出并得到了验证&#xff0c;纯视觉3D目标检测经典的方法有BEVFormer、BEVDet系列、DETR3D、Sparse4D等工作&#xff0c;基于LiDAR的有CenterPoint、多模态有BEVFusion、DAL、UniTR等。 …

更新Java的环境变量后VScode/cursor里面还是之前的环境变量

最近我就遇到这个问题&#xff0c;这个一般是安装了多个版本的Java&#xff0c;并设置好环境变量&#xff0c;但VScode/cursor内部环境变量却没有改变 解决办法 打开设置&#xff0c;或者直接快捷键CTRL&#xff0c;搜索Java:Home编辑settings.json文件 把以下部分改为正确的…