Fetch API 与 XMLHttpRequest:深入剖析异步请求的利器

Hi,我是布兰妮甜 !在现代 Web 开发中,异步通信是实现动态和交互式用户体验的基石。XMLHttpRequest (XHR) 作为老牌劲旅,曾一度统治着这一领域。然而,随着 Fetch API 的横空出世,开发者们迎来了一个更现代、更强大的工具。本文将深入剖析 Fetch APIXMLHttpRequest,从基本概念到高级用法,为您呈现一场异步请求的盛宴。


文章目录

    • 一、XMLHttpRequest:功勋元老
    • 二、Fetch API:新星崛起
    • 三、Fetch API 与 XMLHttpRequest:详细对比
    • 四、高级用法与最佳实践
    • 五、总结


一、XMLHttpRequest:功勋元老

XMLHttpRequest 是一个 JavaScript 对象,它允许网页与服务器进行异步通信。自诞生以来,XHR 便成为 Ajax 技术的核心,为 Web 2.0 的发展立下了汗马功劳。

1.1 核心特性

  • 异步通信: XHR 的最大特点就是异步,它可以在不刷新页面的情况下与服务器交换数据,从而实现页面的局部更新。

  • 灵活控制: XHR 提供了丰富的 API,允许开发者对请求和响应进行精细的控制,例如设置请求头、监听状态变化、获取响应数据等。

1.2 代码示例

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data');
xhr.onreadystatechange = function() {if (xhr.readyState === 4 && xhr.status === 200) {console.log(xhr.responseText);}
};
xhr.send();

1.3 优缺点分析

  • 优点

    • 广泛支持: XHR 被所有主流浏览器支持,兼容性极佳。

    • 功能强大: XHR 提供了丰富的功能和细粒度的控制,可以满足各种复杂场景的需求。

  • 缺点

    • API 复杂: XHR 的 API 设计较为复杂,学习和使用成本较高。

    • 回调地狱: XHR 依赖于回调函数处理异步操作,容易导致代码嵌套过深,难以维护。

    • 缺乏 Promise 支持: XHR 本身不支持 Promise,需要借助第三方库或手动封装。

代码示例

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data');
xhr.onload = function() {if (xhr.status === 200) {console.log(xhr.responseText);} else {console.error('Error:', xhr.statusText);}
};
xhr.onerror = function() {console.error('Request failed');
};
xhr.send();

二、Fetch API:新星崛起

Fetch API 是 XMLHttpRequest 的现代替代品,它提供了更简洁、更强大的方式来执行异步请求。Fetch API 基于 Promise,使得异步代码更加清晰易读。

2.1 核心特性

  • 基于 Promise: Fetch API 使用 Promise 处理异步操作,避免了回调地狱,使代码更加简洁和易于维护。

  • 简洁的 API: Fetch API 的 API 设计更加简洁直观,易于学习和使用。

  • 更强大的功能: Fetch API 提供了比 XHR 更强大的功能,例如对请求和响应对象的更细粒度控制、对流的支持以及更灵活的错误处理。

2.2 代码示例

fetch('https://api.example.com/data').then(response => {if (!response.ok) {throw new Error('Network response was not ok');}return response.json();}).then(data => console.log(data)).catch(error => console.error('Error:', error));

2.3 优缺点分析

  • 优点

    • 简洁易用: Fetch API 的 API 设计简洁直观,学习和使用成本低。

    • 基于 Promise: 使用 Promise 处理异步操作,避免了回调地狱,使代码更加清晰易读。

    • 功能强大: 提供了比 XHR 更强大的功能,例如对流的支持、更灵活的错误处理等。

  • 缺点

    • 浏览器兼容性: Fetch API 在现代浏览器中得到广泛支持,但在一些较旧的浏览器中可能无法使用。

    • 功能限制: 与 XHR 相比,Fetch API 缺少一些功能,例如取消请求和监控进度。

三、Fetch API 与 XMLHttpRequest:详细对比

特性Fetch APIXMLHttpRequest
浏览器支持现代浏览器所有主流浏览器,包括较旧的浏览器
API 设计简洁、直观复杂、笨拙
异步处理基于 Promise基于回调函数
请求和响应对象更细粒度的控制控制较少
流支持支持不支持
错误处理更灵活较不灵活
取消请求不支持支持
监控进度不支持支持

四、高级用法与最佳实践

4.1 Fetch API 的高级用法

  • 自定义请求头: 使用 Headers 对象设置自定义请求头。

  • 发送表单数据: 使用 FormData 对象发送表单数据。

  • 处理二进制数据: 使用 ArrayBufferBlob 对象处理二进制数据。

  • 超时控制: 使用 AbortController 实现请求超时控制。

4.2 XMLHttpRequest 的高级用法

  • 监控请求进度: 使用 onprogress 事件监控请求进度。

  • 上传文件: 使用 FormData 对象上传文件。

  • 设置超时时间: 使用 timeout 属性设置请求超时时间。

  • 取消请求: 使用 abort() 方法取消请求。

4.3 最佳实践

  • 优先使用 Fetch API: 对于新项目,建议优先使用 Fetch API,除非您需要 XHR 提供的特定功能或需要支持较旧的浏览器。

  • 处理错误: 无论是使用 Fetch API 还是 XHR,都要注意处理错误,例如网络错误、服务器错误等。

  • 使用 Promise: 尽量使用 Promise 处理异步操作,避免回调地狱。

  • 代码复用: 将常用的请求逻辑封装成函数或模块,提高代码复用率。

五、总结

Fetch API 和 XMLHttpRequest 都是用于在 Web 应用程序中进行异步通信的强大工具。虽然 XHR 已经存在了很长时间并且被广泛支持,但 Fetch API 提供了一个更现代、更强大的替代方案,具有更简洁的 API 和更强大的功能。对于新项目,建议使用 Fetch API,除非您需要 XHR 提供的特定功能或需要支持较旧的浏览器。

随着 Web 技术的不断发展,Fetch API 正在成为异步请求的标准。它不断获得新的功能和改进,而 XHR 则逐渐被淘汰。因此,建议开发者们尽快熟悉 Fetch API 并将其用于新的项目中。

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

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

相关文章

Classic Control Theory | 12 Real Poles or Zeros (第12课笔记-中文版)

笔记链接:https://m.tb.cn/h.Tt876SW?tkQaITejKxnFLhttps://m.tb.cn/h.Tt876SW?tkQaITejKxnFL

图解感知机(Perceptron)

目录 1.感知机(Perceptron)介绍 2.网络结构与工作原理 3.模型工作示例 4.总结 1.感知机(Perceptron)介绍 感知机(Perceptron)是最早的人工神经网络模型之一,由弗兰克罗森布拉特(…

多旋翼+航模+直升机:多型号无人机飞行表演技术详解

多旋翼、航模、直升机等多种型号的无人机飞行表演技术,是现代科技与艺术的完美结合,它们通过精密的编程、高效的通信、先进的定位与导航技术,以及复杂的编队控制算法,共同呈现出令人震撼的视觉效果。以下是对这些无人机飞行表演技…

deepseek 导出导入模型(docker)

前言 实现导出导入deepseek 模型。deepseek 安装docker下参考 docker 导出模型 实际生产环境建议使用docker-compose.yml进行布局,然后持久化ollama模型数据到本地参考 echo "start ollama" docker start ollama#压缩容器内文件夹,然后拷贝…

【MySQL】表的增删查改(CRUD)(上)

个人主页:♡喜欢做梦 欢迎 👍点赞 ➕关注 ❤️收藏 💬评论 CRUD:Create(新增数据)、Retrieve(查询数据)、Update(修改数据)、Delete(修改数据…

Win11作为宿主机,运行VMware 总没有网络

问题: 移动了VMware到新宿主机上后,虚拟机无法连接网络,其实会显示一个圆圈的图标,这是连接上的图标。 造成这个错误的原因是多种多样的。 用下面的方法来查排查错误。 1.控制面板-> 网络连接 安装好虚拟机后,会…

edge浏览器将书签栏顶部显示

追求效果,感觉有点丑,但总归方便多了 操作路径:设置-外观-显示收藏夹栏-始终

快速入门——第三方组件element-ui

学习自哔哩哔哩上的“刘老师教编程”,具体学习的网站为:10.第三方组件element-ui_哔哩哔哩_bilibili,以下是看课后做的笔记,仅供参考。 第一节 组件间的传值 组件可以有内部Data提供数据,也可由父组件通过prop方式传…

代码审计入门学习之sql注入

路由规则 入口文件&#xff1a;index.php <?php // ---------------------------------------------------------------------- // | wuzhicms [ 五指互联网站内容管理系统 ] // | Copyright (c) 2014-2015 http://www.wuzhicms.com All rights reserved. // | Licensed …

基于vue和微信小程序的校园自助打印系统(springboot论文源码调试讲解)

第3章 系统设计 3.1系统功能结构设计 本系统的结构分为管理员和用户、店长。本系统的功能结构图如下图3.1所示&#xff1a; 图3.1系统功能结构图 3.2数据库设计 本系统为小程序类的预约平台&#xff0c;所以对信息的安全和稳定要求非常高。为了解决本问题&#xff0c;采用前端…

QQ登录测试用例报告

QQ登录测试用例思维导图 一、安全性测试用例 1. 加密传输与存储验证 测试场景&#xff1a;输入账号密码并提交登录请求。预期结果&#xff1a;账号密码通过加密传输&#xff08;如HTTPS&#xff09;与存储&#xff08;如哈希加盐&#xff09;&#xff0c;无明文暴露。 2. 二…

【AI算法岗面试八股面经【超全整理】——机器学习】

AI算法岗面试八股面经【超全整理】 概率论【AI算法岗面试八股面经【超全整理】——概率论】信息论【AI算法岗面试八股面经【超全整理】——信息论】机器学习【AI算法岗面试八股面经【超全整理】——机器学习】深度学习【AI算法岗面试八股面经【超全整理】——深度学习】NLP【A…

luci界面开发中的MVC架构——LuCI介绍(二)

想要给openwrt开发应用&#xff0c;虽然直接可执行程序也可以运行&#xff0c;但是没有UI会很不方便&#xff0c;想要开发UI就要用openwrt的那一套&#xff0c;自然就是LuCI&#xff0c;LuCI又用了一套MVC框架&#xff0c;今天就讲讲这是个什么东西。 OpenWrt LuCI 界面开发中…

网络安全监测探针安装位置 网络安全监测系统

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 软件简介&#xff1a; SockMon(SocketMonitor)网络安全监控系统是一款为电脑专业人员打造的一款出色的安防监控软件。在如今这个恶意软件&#xff0c;攻击&#…

车载DoIP协议 --- TCP详细解析

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

DeepSeek-R1本地部署保姆级教程

一、DeepSeek-R1本地部署配置要求 &#xff08;一&#xff09;轻量级模型 ▌DeepSeek-R1-1.5B 内存容量&#xff1a;≥8GB 显卡需求&#xff1a;支持CPU推理&#xff08;无需独立GPU&#xff09; 适用场景&#xff1a;本地环境验证测试/Ollama集成调试 &#xff08;二&a…

2025年SCI一区智能优化算法:真菌生长优化算法(Fungal Growth Optimizer,FGO),提供MATLAB代码

一. 真菌生长优化算法&#xff08;FGO&#xff09; 真菌生长优化算法&#xff08;Fungal Growth Optimizer&#xff0c;FGO&#xff09;是一种新型的自然启发式元启发式算法&#xff0c;其灵感来源于自然界中真菌的生长行为。该算法通过模拟真菌的菌丝尖端生长、分支和孢子萌发…

【人工智能】蓝耘智算平台盛大发布DeepSeek满血版:开创AI推理体验新纪元

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 蓝耘智算平台 蓝耘智算平台核心技术与突破元生代推理引擎快速入门&#xff1a;三步调用大模型接口&#xff0c;OpenAI SDK无缝兼容实战用例文…

基于AVue的二次封装:快速构建后台管理系统的CRUD方案

基于AVue的二次封装&#xff1a;快速构建后台管理系统的CRUD方案 在开发后台管理系统时&#xff0c;表格是常见的组件之一。然而&#xff0c;使用原生的Element Plus实现CRUD&#xff08;增删改查&#xff09;功能往往需要编写大量重复代码&#xff0c;过程繁琐。即使借助类似…

Spring全局异常处理

在项目开发中&#xff0c;异常是经常遇到的&#xff0c;但是如何更高效的处理好异常信息&#xff0c;让我们能快速定位到BUG&#xff0c;是很重要的&#xff0c;不仅能够提高我们的开发效率&#xff0c;还能让你代码看上去更舒服&#xff0c;SpringBoot的项目已经对有一定的异常…