xhr、ajax、axois、fetch的区别
一、XMLHttpRequest (XHR)、AJAX、Axios 和 Fetch API 都是用于在不重新加载整个页面的情况下与服务器进行通信的技术和库。它们在处理超时、终止请求、进度反馈等机制上有一些显著的差异。以下是它们的详细比较:
1. XMLHttpRequest (XHR)
XMLHttpRequest 是一种浏览器内置的对象,用于与服务器进行交互。它可以发送和接收各种格式的数据,包括 JSON、XML、HTML 和纯文本。
特点
- 原生 JavaScript 对象,无需额外引入库。
- 支持同步和异步请求。
- 语法较为复杂,需要手动处理回调和状态变化。
- 支持超时设置、终止请求和进度事件。
示例
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);// 设置超时
xhr.timeout = 5000; // 5秒// 处理超时
xhr.ontimeout = function () {console.error('Request timed out');
};// 处理进度事件
xhr.onprogress = function (event) {if (event.lengthComputable) {const percentComplete = (event.loaded / event.total) * 100;console.log(`Progress: ${percentComplete}%`);}
};// 处理请求完成
xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {console.log(JSON.parse(xhr.responseText));}
};// 终止请求
const abortButton = document.getElementById('abortButton');
abortButton.addEventListener('click', function () {xhr.abort();console.log('Request aborted');
});xhr.send();
2. AJAX (使用 jQuery)
AJAX(Asynchronous JavaScript and XML)是一种使用多种技术(包括 XMLHttpRequest)来创建异步 Web 应用程序的方法。它允许网页在后台与服务器进行通信,从而实现动态更新页面内容,而无需重新加载整个页面。
特点
- 通常使用 XMLHttpRequest 或 Fetch API 实现。
- 可以与各种 JavaScript 库(如 jQuery)结合使用,简化请求处理。
- jQuery 的 ajax 方法支持超时设置、终止请求和进度事件。
示例(使用 jQuery)
const xhr = $.ajax({url: 'https://api.example.com/data',method: 'GET',timeout: 5000, // 5秒xhr: function () {const xhr = new window.XMLHttpRequest();// 处理进度事件xhr.onprogress = function (event) {if (event.lengthComputable) {const percentComplete = (event.loaded / event.total) * 100;console.log(`Progress: ${percentComplete}%`);}};return xhr;},success: function (data) {console.log(data);},error: function (error) {if (error.statusText === 'timeout') {console.error('Request timed out');} else {console.error(error);}}
});// 终止请求
const abortButton = document.getElementById('abortButton');
abortButton.addEventListener('click', function () {xhr.abort();console.log('Request aborted');
});
3. Axios
Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js。它提供了更简洁的 API 和更强大的功能,简化了 HTTP 请求的处理。
特点
- 基于 Promise,支持异步操作。
- 支持请求和响应拦截器。
- 自动转换 JSON 数据。
- 支持取消请求。
- 更简洁的语法和更好的错误处理。
- 支持超时设置和进度事件(通过配置选项)。
示例
const CancelToken = axios.CancelToken;
let cancel;// 发送请求
axios.get('https://api.example.com/data', {cancelToken: new CancelToken(function executor(c) {cancel = c;}),timeout: 5000, // 5秒onDownloadProgress: function (progressEvent) {if (progressEvent.lengthComputable) {const percentComplete = (progressEvent.loaded / progressEvent.total) * 100;console.log(`Progress: ${percentComplete}%`);}}
})
.then(response => {console.log(response.data);
})
.catch(error => {if (axios.isCancel(error)) {console.log('Request canceled', error.message);} else if (error.code === 'ECONNABORTED') {console.error('Request timed out');} else {console.error('Fetch error:', error);}
});// 终止请求
const abortButton = document.getElementById('abortButton');
abortButton.addEventListener('click', function () {cancel('Request canceled by the user.');
});
4. Fetch API
Fetch API 是一种现代的、基于 Promise 的方式来进行网络请求。它提供了更简洁的 API 和更强大的功能,简化了 HTTP 请求的处理。
特点
- 基于 Promise,支持异步操作。
- 语法更简洁,易于阅读和维护。
- 默认不发送 cookies,需要手动配置。
- 更好的错误处理机制。
- 支持流式处理响应。
- 现代浏览器支持较好,但在一些旧浏览器中需要使用 polyfill。
- 不直接支持超时和进度事件,需要手动实现。
示例
const controller = new AbortController();
const signal = controller.signal;fetch('https://api.example.com/data', { signal }).then(response => {if (!response.ok) {throw new Error('Network response was not ok');}return response.json();}).then(data => console.log(data)).catch(error => {if (error.name === 'AbortError') {console.log('Fetch aborted');} else {console.error('Fetch error:', error);}});// 终止请求
const abortButton = document.getElementById('abortButton');
abortButton.addEventListener('click', function () {controller.abort();
});
二、比较
| 特性 | XMLHttpRequest (XHR) | AJAX (使用 jQuery) | Axios | Fetch API |
|---|---|---|---|---|
| 基于 | 原生 JavaScript | XMLHttpRequest | Promise | Promise |
| 语法简洁性 | 较复杂 | 较简洁 | 非常简洁 | 非常简洁 |
| 异步支持 | 是 | 是 | 是 | 是 |
| JSON 自动转换 | 否 | 否 | 是 | 是 |
| 请求/响应拦截器 | 否 | 否 | 是 | 否(需要手动实现) |
| 取消请求 | 是 | 是 | 是 | 是(通过 AbortController) |
| 进度事件 | 是 | 是 | 是(通过配置选项) | 否(需要手动实现) |
| 超时机制 | 是 | 是 | 是 | 否(需要手动实现) |
| 浏览器兼容性 | 所有现代浏览器 | 所有现代浏览器 | 所有现代浏览器和 Node.js | 现代浏览器(旧浏览器需 polyfill) |
三、总结
- XMLHttpRequest (XHR):较旧的技术,支持广泛,但语法较为复杂,支持超时设置、终止请求和进度事件。
- AJAX:通常指的是使用 XMLHttpRequest 或其他技术来实现异步通信的整体方法,常与 jQuery 等库结合使用,支持超时设置、终止请求和进度事件。
- Axios:现代的 HTTP 客户端,基于 Promise,提供了更简洁的语法和更强大的功能,支持请求和响应拦截器、取消请求、超时设置和进度事件(通过配置选项)。
- Fetch API:现代的 HTTP 请求方式,基于 Promise,语法简洁,错误处理更好,但不直接支持超时和进度事件,需要手动实现。
选择哪种技术取决于你的项目需求和浏览器支持情况。对于现代 Web 开发,Axios 和 Fetch API 通常是首选,但在需要兼容旧浏览器的情况下,AJAX 仍然是一个有效的选择。
相关文章:
xhr、ajax、axois、fetch的区别
一、XMLHttpRequest (XHR)、AJAX、Axios 和 Fetch API 都是用于在不重新加载整个页面的情况下与服务器进行通信的技术和库。它们在处理超时、终止请求、进度反馈等机制上有一些显著的差异。以下是它们的详细比较: 1. XMLHttpRequest (XHR) XMLHttpRequest 是一种浏…...
【HuggingFace Transformers】OpenAIGPTModel源码解析
OpenAIGPTModel源码解析 1. GPT 介绍2. OpenAIGPTModel类 源码解析 说到ChatGPT,大家可能都使用过吧。2022年,ChatGPT的推出引发了广泛的关注和讨论。这款对话生成模型不仅具备了强大的语言理解和生成能力,还能进行非常自然的对话,…...
macOS安装Java和Maven
安装Java Java Downloads | Oracle 官网下载默认说最新的Java22版本,注意这里我们要下载的是Java8,对应的JDK1.8 需要登陆Oracle,没有账号的可以百度下。账号:908344069qq.com 密码:Java_2024 Java8 jdk1.8配置环境变量 open -e ~/.bash_p…...
SpringBoot教程(安装篇) | Elasticsearch的安装
SpringBoot教程(安装篇) | Elasticsearch的安装 一、确定Elasticsearch版本二、下载elasticsearch(windows版本)官网下载如何解压配置 允许 别人跨域 访问自己启动运行 三、Es可视化工具安装(elasticsearch-head&#…...
前端登录鉴权——以若依Ruoyi前后端分离项目为例解读
权限模型 Ruoyi框架学习——权限管理_若依框架权限-CSDN博客 用户-角色-菜单(User-Role-Menu)模型是一种常用于权限管理的设计模式,用于实现系统中的用户权限控制。该模型主要包含以下几个要素: 用户(User)…...
【Tools】大模型中的自注意力机制
摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样 🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一…...
PhotoZoom Classic 9软件新功能特性及安装激活图文教程
PhotoZoom Classic 9这款软件能够对数码图片进行放大,而且放大后的图片没有任何的品质的损坏,没有锯齿,不会失真,如果您有兴趣的话可以试试哦! PhotoZoom Classic 9软件新功能特性 通过屡获殊荣的 S-Spline XL 插值…...
【数据结构】直接插入排序
目录 一、基本思想 二、动图演示 三、思路分析 四、代码实现 五、易错提醒 六、时间复杂度分析 一、基本思想 直接插入排序(Straight Insertion Sort)是一种简单直观的排序算法,其基本思想是: 把待排序的一个记录按其关键码…...
JavaScript 实现虚拟滚动技术
虚拟滚动 虚拟滚动(有时称为 虚拟列表、虚拟滚动条)是 JavaScript 中的一种技术,旨在优化大数据量的列表渲染,尤其是当有成千上万的数据项时,直接渲染整个列表会导致性能问题。虚拟列表通过只渲染用户视口中可见的那一…...
【重学 MySQL】十八、逻辑运算符的使用
【重学 MySQL】十八、逻辑运算符的使用 AND运算符OR运算符NOT运算符异或运算符使用 XOR 关键字使用 BIT_XOR() 函数注意事项 注意事项 在MySQL中,逻辑运算符是构建复杂查询语句的重要工具,它们用于处理布尔类型的数据,进行逻辑判断和组合条件…...
关于 QImage原始数据格式与cv::Mat原始数据进行手码数据转换 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/141996117 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
前端WebSocket客户端实现
// 创建WebSocket连接 var socket new WebSocket(ws://your-spring-boot-server-url/websocket-endpoint);// 连接打开时触发 socket.addEventListener(open, function (event) {socket.send(JSON.stringify({type: JOIN, room: general})); });// 监听从服务器来的消息 socke…...
读取realsense d455双目及imu
问题定义 实时读取realsense数据喂给slam系统 代码 /** rs_d455设备 */#include <librealsense2/rs.hpp> #include <iostream>#include "rs_common_device.h"// opencv #include <opencv2/opencv.hpp>class RsD455Device: public rsCmmonDevice…...
浮点的运算
浮点数表示: N 尾数 * 基数指数 1.25 X 106 尾数一般用补码,指数一般用移码 在IEEE745中尾数可以是原码。 尾数可以表示数值的有效精度,位数越多精度越高 阶码的位数决定数的表示范围,位数越多,范围越大 对阶时&…...
对随机游走问题的分析特定行为模式的建模
从一段随机游走的数据中寻找特定的行为模式,这种问题涉及 序列模式识别 或 序列分析。处理这种问题的算法选择取决于你要找的模式的具体性质和复杂性。以下是几种可能的算法: 隐马尔可夫模型(HMM) 隐马尔可夫模型特别适合处理随…...
JVM面试(七)G1垃圾收集器剖析
概述 上一章我们说了,G1收集器,它属于里程碑式的发展,开创了面向局部收集垃圾的概念。专门针对多核处理器以及大内存的机器。在JDK9中,更是呗指定为官方的GC收集器。满足高吞吐的通知满足GC的STW停顿时间尽可能的短。 虽然现在我…...
php转职golang第一期
入局golang 基础语法:学习 Go 语言的基本语法、数据类型、流程控制等。 数据结构与算法:掌握常用的数据结构和算法。 Web 开发基础:了解 HTTP 协议、Web 开发的基本概念。 Gin 框架或其他 Web 框架:深入学习使用一种 Go 的 Web…...
java后端服务监控与告警:Prometheus与Grafana集成
Java后端服务监控与告警:Prometheus与Grafana集成 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在现代的微服务架构中,监控和告警是确保服务稳定性的关键组成部分。Pr…...
【系统架构设计师】工厂方法设计模式
工厂方法(Factory Method)模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化延迟到子类中进行。 工厂方法模式的主要角色 产品(Product):定义工厂的创建对象的接口。具体产品(Concrete Product):实…...
怎样解决OpenEuler下载sdl2失败
OpenEuler 下载 sdl2失败 解决办法(使用wget中git上下载) wget https://github.com/libsdl-org/SDL/releases/download/release-2.30.6/SDL2-2.30.6.tar.gz使用yum下载,下载的最后说找不到这样的库(no match)使用 apt-get,说找不到apt-get使用curl冲gi…...
如何解锁索尼相机的隐藏功能:OpenMemories-Tweak完整指南
如何解锁索尼相机的隐藏功能:OpenMemories-Tweak完整指南 【免费下载链接】OpenMemories-Tweak Unlock your Sony cameras settings 项目地址: https://gitcode.com/gh_mirrors/op/OpenMemories-Tweak 你是否曾想过,你的索尼相机可能隐藏着更多潜…...
Unity Android打包卡在detecting sdk tools version的根因与四套解决方案
1. 这个卡在“detecting current sdk tools version”的坑,我踩了三次才摸清门道 Unity打包时卡在“detecting current sdk tools version”这行日志上,光标静止、进度条不动、CPU占用率忽高忽低——你点开Android SDK目录,发现tools文件夹里…...
灾变瞬间生成人员分布图,为抢险决策提供可靠依据 ——视频孪生智能态势研判矿山抢险决策技术方案
灾变瞬间生成人员分布图,为抢险决策提供可靠依据——视频孪生智能态势研判矿山抢险决策技术方案一、方案引言煤矿井下瓦斯爆炸、顶板垮塌、透水突涌等灾害具备瞬时爆发、连锁破坏、环境骤变的典型特征。险情发生短短数分钟内,巷道结构受损变形、供电通信…...
TV Bro电视浏览器:让智能电视变身全能上网终端的终极指南
TV Bro电视浏览器:让智能电视变身全能上网终端的终极指南 【免费下载链接】tv-bro Simple web browser for android optimized to use with TV remote 项目地址: https://gitcode.com/gh_mirrors/tv/tv-bro 你是否曾经尝试在智能电视上浏览网页,却…...
为什么你的DeepSeek流式接口总在TP99处陡增?揭秘TCP_NODELAY误配+LLM输出熵突变双重陷阱
更多请点击: https://intelliparadigm.com 第一章:为什么你的DeepSeek流式接口总在TP99处陡增?揭秘TCP_NODELAY误配LLM输出熵突变双重陷阱 当 DeepSeek-R1 或 DeepSeek-V3 的流式响应(如 /v1/chat/completions 启用 streamtrue&a…...
Taotoken的Token Plan如何帮助我们控制月度AI支出
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken的Token Plan如何帮助我们控制月度AI支出 1. 从按需付费到计划消费的转变 作为自由职业者或小型工作室,我们在…...
3大核心技术深度解析:泉盛UV-K5/K6对讲机LOSEHU固件完全配置指南
3大核心技术深度解析:泉盛UV-K5/K6对讲机LOSEHU固件完全配置指南 【免费下载链接】uv-k5-firmware-custom 全功能泉盛UV-K5/K6固件 Quansheng UV-K5/K6 Firmware 项目地址: https://gitcode.com/gh_mirrors/uvk5f/uv-k5-firmware-custom 泉盛UV-K5/K6对讲机L…...
Windows 11硬件限制绕过终极指南:让不支持的设备完美运行最新系统
Windows 11硬件限制绕过终极指南:让不支持的设备完美运行最新系统 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.ba…...
AI时代公众号生存指南(ChatGPT自动化运营全链路拆解)
更多请点击: https://codechina.net 第一章:AI时代公众号的生存逻辑与定位重构 在生成式AI深度渗透内容生态的当下,公众号已从“流量分发管道”蜕变为“人机协同的认知接口”。其生存逻辑不再依赖单一的推送频次或标题党技巧,而取…...
【限时开放】DeepSeek R1/R2安全加固白皮书(含32项合规检测Checklist+自动扫描脚本)
更多请点击: https://codechina.net 第一章:DeepSeek模型安全加固概述 DeepSeek系列大语言模型在开源生态中广泛应用,但其默认部署配置存在若干潜在安全风险,包括提示注入、越权推理、敏感信息泄露及未经授权的模型微调访问。安全…...
