Ajax与Fetch API在Web开发中的性能、用法与未来趋势比较

news2024/10/6 3:07:10

Ajax和Fetch都是JavaScript中用于从客户端向服务器发送请求以获取数据的技术,但它们之间存在一些显著的区别。以下是对这两种技术的详细比较:

一、技术基础与实现方式

  1. Ajax

    • 基础:Ajax全称为Asynchronous JavaScript and XML(异步JavaScript和XML),是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术。
    • 实现方式:Ajax通常使用XMLHttpRequest对象来进行请求和响应的处理。这种方式的语法相对较复杂,需要编写更多的代码来处理回调函数和状态。
  2. Fetch

    • 基础:Fetch是现代JavaScript中的一个API,提供了对Request和Response对象的通用定义,用于处理网络请求。
    • 实现方式:Fetch使用Promise对象来处理异步操作,可以链式调用,使代码更易于理解和维护。Fetch的API风格更加简洁,且功能强大。

二、异步处理与代码风格

  1. Ajax

    • 异步处理:Ajax使用回调函数来处理异步操作,这可能导致回调地狱(callback hell)的问题,特别是在复杂的请求链中。
    • 代码风格:Ajax的代码风格相对传统,需要手动处理请求和响应的多个方面。
  2. Fetch

    • 异步处理:Fetch使用Promise对象来处理异步操作,这使得处理异步请求更为灵活和简洁。可以使用async/await来编写清晰的异步代码,避免了回调地狱的问题。
    • 代码风格:Fetch的代码风格更加现代和简洁,易于理解和维护。

三、跨域请求与CORS

  1. Ajax

    • 跨域请求:Ajax请求可以跨越不同的域名,但需要适当处理CORS(跨源资源共享)问题。Ajax可以通过JSONP、代理服务器等技术来进行跨域请求。
  2. Fetch

    • 跨域请求:Fetch对跨域请求有更严格的限制,因为它遵循了同源策略。如果需要进行跨域请求,需要在服务器端设置适当的CORS头以允许跨域请求。Fetch请求可以自动处理CORS问题,但在某些情况下可能需要额外的配置。

四、其他特点

  1. Ajax

    • 灵活性:Ajax可以自定义请求头、请求体、响应格式等,提供了较高的灵活性。
    • 兼容性:Ajax在老版本的浏览器中可能存在兼容性问题,但随着现代浏览器的普及,这个问题已经得到了很大的改善。
  2. Fetch

    • 自带超时处理:Fetch可以在请求超时后自动中断请求,避免了长时间等待。
    • 响应处理:Fetch提供了丰富的方法来处理响应数据,如.json()、.text()、.blob()等,使得处理响应数据更加方便。

用法

fetch 是 JavaScript 中的一个现代且强大的网络请求 API,它提供了一种简单、逻辑清晰的方式来跨网络异步获取资源。fetch 返回一个 Promise,这使得它很容易与 JavaScript 的异步/等待(async/await)语法一起使用。以下是一些基本用法示例:

基本 GET 请求

fetch('https://api.example.com/data')
  .then(response => {
    if (!response.ok) {
        throw new Error('Network response was not ok');
    }
    return response.json(); // 解析 JSON 数据
  })
  .then(data => {
    console.log(data); // 处理数据
  })
  .catch(error => {
    console.error('There was a problem with your fetch operation:', error);
  });

使用 async/await

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    if (!response.ok) {
        throw new Error('Network response was not ok');
    }
    const data = await response.json(); // 等待 JSON 解析
    console.log(data);
  } catch (error) {
    console.error('There was a problem with your fetch operation:', error);
  }
}

fetchData();

POST 请求

fetch('https://api.example.com/data', {
  method: 'POST', // 或者 'PUT'
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    key: 'value',
  }),
})
.then(response => response.json())
.then(data => console.log(data))
.catch((error) => console.error('Error:', error));

自定义请求头

fetch('https://api.example.com/data', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_TOKEN_HERE',
    'Content-Type': 'application/json',
  },
})
.then(response => response.json())
.then(data => console.log(data))
.catch((error) => console.error('Error:', error));

注意事项

  • fetch 不会自动处理 JSON 数据,你需要使用 .json() 方法来解析 JSON 响应体。
  • fetch 遵循 CORS(跨源资源共享)策略,如果请求跨域,则必须服务器支持 CORS。
  • fetch 抛出的错误不会自动被 .catch() 捕获,只有请求本身成功(即 HTTP 状态码在 200-299 范围内),但解析响应体(如 .json())时出错,才会被 .catch() 捕获。因此,通常检查 response.ok 属性是一个好习惯。
  • fetchbody 属性可以是多种类型,如 BlobBufferSourceFormDataURLSearchParamsUSVString 对象。对于 JSON 数据,需要手动 JSON.stringify() 转换。

fetch API 提供了灵活的网络请求功能,是现代前端开发中不可或缺的一部分。

html中完整使用fetch的示例

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">  
    <title>Fetch Example</title>  
</head>  
<body>  
  
<h1>Fetch API Example</h1>  
  
<!-- 你可以在这里添加更多的HTML内容 -->  
  
<script>  
    // 使用async/await语法进行fetch请求  
    async function fetchData() {  
        try {  
            // 发起fetch请求  
            const response = await fetch('https://api.example.com/data');  
  
            // 检查响应是否成功  
            if (!response.ok) {  
                throw new Error('Network response was not ok: ' + response.statusText);  
            }  
  
            // 解析JSON响应体  
            const data = await response.json();  
  
            // 处理数据,例如:在控制台中打印  
            console.log(data);  
  
            // 你也可以在这里将数据显示在HTML页面上  
            // 例如:document.getElementById('someElementId').innerText = JSON.stringify(data);  
  
        } catch (error) {  
            // 捕获并处理任何错误  
            console.error('There was a problem with your fetch operation:', error);  
        }  
    }  
  
    // 调用函数  
    fetchData();  
</script>  
  
</body>  
</html>

五、总结

Ajax和Fetch各有优缺点,适用于不同的场景。Ajax作为一种传统的技术,在旧的应用和环境中仍然广泛使用,并且具有较高的灵活性。而Fetch作为现代JavaScript中的API,提供了更简洁、功能更强大的方式来处理网络请求,特别适合使用在现代JavaScript应用中。开发者可以根据实际需求和场景选择合适的技术。

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

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

相关文章

STM32实现看门狗(HAL库)

文章目录 一. 看门狗1. 独立看门狗&#xff08;IWDG&#xff09;1.1 原理1.2 相关配置1.3 相关函数 2. 窗口看门狗&#xff08;WWDG&#xff09;2.1 原理2.2 相关配置2.3 相关函数 一. 看门狗 单片机在日常工作中常常会因为用户配置代码出现BUG&#xff0c;而导致芯片无法正常工…

如何对GD32 MCU进行加密?

GD32 MCU有哪些加密方法呢&#xff1f;大家在平时项目开发的过程中&#xff0c;最后都可能会面临如何对出厂产品的MCU代码进行加密&#xff0c;避免产品流向市场被别人读取复制。 下面为大家介绍GD32 MCU所支持的几种常用的加密方法&#xff1a; 首先GD32 MCU本身支持防硬开盖…

无需服务器,浏览器跑700+AI模型?!【送源码】

Transformers.js 是一个创新的网络机器学习库&#xff0c;它将先进的 Transformer 模型直接带入浏览器&#xff0c;无需服务器端支持。这个库与 Hugging Face 的 Python transformers 库功能对等&#xff0c;提供相似的 API 接口来运行预训练模型&#xff0c;涵盖了自然语言处理…

人工智能系列-Python面向对象编程

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 面向对象编程和面向过程编程 在使用计算机语言进行代码编写时&#xff0c;常见的两种思路是面向对象编程和面向过程编程。 面向过程&#xff1a;根据业务逻辑从上到下写代码。…

Hi6602 恒压恒流SSR电源方案

Hi6602是一款针对离线式反激电源设计的高性能PWM控制器。Hi6602内集成有通用的原边恒流控制技术&#xff0c;可支持断续模式和连续模式工作&#xff0c;适用于恒流输出的隔离型电源应用中。Hi6602内部具有高精度65kHz开关频率振荡器&#xff0c;且带有抖频功能可优化EMI性能。H…

【Python迭代器探秘】:揭秘迭代器与生成器的魔法,掌握高效循环的艺术

文章目录 一、迭代器的基本概念1.1 迭代器优点1.2 迭代器的编写方法1.3 python内置迭代器函数1.4 小结1.5 迭代器对象与迭代对象1.5.1 区别1. 迭代对象2. 迭代器对象3. 小结 1.5.2 方法区分 二、生成器基本概念1. 生成器函数2. 生成器表达式 一、迭代器的基本概念 迭代器是Pyt…

【数据结构/操作系统 堆和栈】区别及应用场景、底层原理图解

堆和栈 比较有趣的是&#xff0c;计算机网络、操作系统中都会对堆栈有不同方面比较详细的描述&#xff0c;而使用的地方通常对这些底层的细节表现得没有那么明显。 但如果你能了解堆栈在计算机网络和操作系统中的表现形式&#xff0c;在你写代码时就会有不一样的认识&#xff…

基于AOP的数据字典实现:实现前端下拉框的可配置更新

作者&#xff1a;后端小肥肠 创作不易&#xff0c;未经允许严禁转载。 目录 1. 前言 2. 数据字典 2.1. 数据字典简介 2.2. 数据字典如何管理各模块的下拉框 3. 数据字典核心内容解读 3.1. 表结构 3.2. 核心代码 3.2.1. 根据实体类名称获取下属数据字典 3.2.2. 数据字…

【QT】显示类控件

显示类控件 显示类控件1. label - 标签2. LCD Number - 显示数字的控件3. ProgressBar - 进度条4. Calendar Widget - 日历5. Line Edit - 输入框6. Text Edit - 多行输入框7. Combo Box - 下拉框8. Spin Box - 微调框9. Date Edit & Time Edit - 日期微调框10. Dial - 旋钮…

3-4 优化器和学习率

3-4 优化器和学习率 主目录点这里 优化器是机器学习和深度学习模型训练过程中用于调整模型参数的方法。它的主要目标是通过最小化损失函数来找到模型参数的最优值&#xff0c;从而提升模型的性能。 在深度学习中&#xff0c;优化器使用反向传播算法计算损失函数相对于模型参数…

pycharm远程连接和conda环境参考博客自用整理

pycharm远程连接 pycharm的连接需要先用xftp把项目上传上去&#xff08;包括venv&#xff09;&#xff0c;似乎才能连 https://blog.csdn.net/weixin_41174300/article/details/134420981 注意要上传一份一模一样的&#xff0c;然后在deployment里面添加mapping 注意传输文件…

【C语言】操作符--百科全书

目录 一、操作符的分类 二、 ⼆进制和进制转换 三、 原码、反码、补码 四、 移位操作符 五、位操作符&#xff1a;&、|、^、~ 六、单⽬操作符 七、逗号表达式 八、 下标访问[]、函数调⽤() 九、结构体 十、操作符的属性&#xff1a;优先级、结合性 十一、表达式…

P1392 取数

传送门&#xff1a;取数 如若你看完题解后&#xff0c;仍有问题&#xff0c;欢迎评论 首先说一下 我首先想到的思路 &#xff08; 20%通过率 &#xff09;&#xff1a;通过dfs , 将所有的情况放入priority_queue中&#xff08;greater<int>&#xff09;&#xff0c;维持…

【ARMv8/v9 GIC 系列 1.7 -- GIC PPI | SPI | SGI | LPI 中断使能配置介绍】

文章目录 GIC 各种中断使能配置PPIs(每个处理器私有中断)SPIs(共享外设中断)SGIs(软件生成的中断)LPIs(局部中断)GIC 各种中断使能配置 在ARM GICv3和GICv4架构中,不同类型的中断(如PPIs、SPIs、SGIs和LPIs)可以通过不同的方式进行启用和禁用。 下面详细介绍这些中…

java项目总结6

目录 1.双列集合 2.map的三种遍历方式&#xff1a; 1.键找值 2.键值对 3.lambda遍历map 3.HashMap 例子&#xff1a;统计字符出现次数 4.LinkedHashMap 5.TreeMap 6.可变参数 7.Collections: 1.双列集合 双列集合特点&#xff1a; 定义Map<String&#xff0c;St…

【Python】已解决:(paddleocr导包报错)ModuleNotFoundError: No module named ‘paddle’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;&#xff08;paddleocr导包报错&#xff09;ModuleNotFoundError: No module named ‘paddle’ 一、分析问题背景 近日&#xff0c;一些使用PaddleOCR库进行文字…

移动校园(3):处理全校课程数据excel文档,实现空闲教室查询与课程表查询

首先打开教学平台 然后导出为excel文档 import mathimport pandas as pd import pymssql serverName 127.0.0.1 userName sa passWord 123456 databaseuniSchool conn pymssql.connect(serverserverName,useruserName,passwordpassWord,databasedatabase) cursor conn.cur…

vue3项目 前端blocked:mixed-content问题解决方案

一、问题分析 blocked:mixed-content其实浏览器不允许在https页面里嵌入http的请求&#xff0c;现在高版本的浏览器为了用户体验&#xff0c;都不会弹窗报错&#xff0c;只会在控制台上打印一条错误信息。一般出现这个问题就是在https协议里嵌入了http请求&#xff0c;解决方法…

拉曼光谱入门:3.拉曼光谱的特征参数与定量定性分析策略

1.特征参数 1.1 退偏振率 退偏振率&#xff08;p&#xff09;是一个衡量拉曼散射光偏振状态的参数&#xff0c;它描述了拉曼散射光的偏振方向与入射光偏振方向之间的关系。退偏振率定义为垂直偏振方向的拉曼散射强度与平行偏振方向的拉曼散射强度之比。退偏振率&#xff08;p&…

逆变器学习笔记(二)

用正点原子示波器看交流220V波形的时候&#xff0c;一定注意先把探头调到X10档位&#xff01;&#xff01;!!!!!!!!!!!!!!!!!!!!!!!!!!! 全桥LLC电路&#xff1a; 1.电感的两种模式——DCM和CCM的区别&#xff1a; DCM&#xff08;Discontinuous Conduction Mode&#xff0c;…