Fetch API如何使用

fetch api是现代web开发中基于promise的网络请求工具,它通过链式调用和async/await语法简化异步操作,支持get、post等请求,并可通过配置对象设置请求头、请求体等;与xmlhttprequest相比,fetch语法更简洁、语义更清晰,但默认不发送cookies且不自动reject http错误状态码,需手动检查response.ok来捕获4xx/5xx错误;其高级用法包括使用abortcontroller取消请求、通过formdata上传文件、调用.text()/.blob()等方法处理不同响应类型,以及创建自定义request和response对象,适用于复杂场景如请求拦截、缓存和service worker,从而构建灵活可靠的网络通信机制。

Fetch API如何使用

Fetch API,说实话,它就是现代Web开发里进行网络请求的一个利器。它基于Promise,这意味着你可以用一种更现代、更链式的方式去处理异步操作,告别过去那种回调地狱的烦恼。简单来说,你需要一个URL,然后Fetch会帮你把数据“抓”回来。

Fetch API的使用,核心思路就是调用

fetch()

函数,它会返回一个Promise。这个Promise解析后会得到一个

Response

对象,然后你通常需要再调用

Response

对象上的方法(比如

.json()

.text()

)来解析响应体,这又会返回一个新的Promise。

解决方案

最基础的用法,一个GET请求:

fetch('https://api.example.com/data')  .then(response => {    // 检查HTTP状态码,确保请求成功    if (!response.ok) {      // 抛出错误,让catch块捕获      throw new Error(`HTTP error! status: ${response.status}`);    }    // 解析JSON响应体    return response.json();  })  .then(data => {    console.log('获取到的数据:', data);  })  .catch(error => {    // 处理网络错误或上面throw的错误    console.error('Fetch操作中出现问题:', error);  });

发送POST请求,或者需要配置请求头、请求体时,

fetch()

函数可以接受第二个参数,一个配置对象:

const postData = {  title: '我的新文章',  body: '这是一篇关于Fetch API的文章内容。',  userId: 1};fetch('https://api.example.com/posts', {  method: 'POST', // 请求方法  headers: {    'Content-Type': 'application/json', // 告诉服务器发送的是JSON    'Authorization': 'Bearer your_token_here' // 认证信息  },  body: JSON.stringify(postData) // 将JavaScript对象转换为JSON字符串}).then(response => {  if (!response.ok) {    throw new Error(`HTTP error! status: ${response.status}`);  }  return response.json();}).then(data => {  console.log('新文章创建成功:', data);}).catch(error => {  console.error('创建文章失败:', error);});

当然,现在大家更喜欢用

async/await

来写异步代码,它让Promise链看起来更像同步代码,可读性确实好不少:

async function fetchData() {  try {    const response = await fetch('https://api.example.com/data');    if (!response.ok) {      throw new Error(`HTTP error! status: ${response.status}`);    }    const data = await response.json();    console.log('使用async/await获取到的数据:', data);  } catch (error) {    console.error('使用async/await时Fetch操作出现问题:', error);  }}fetchData();

Fetch API与XMLHttpRequest有哪些显著区别

刚开始接触Fetch API时,可能不少人会想到它和老牌的XMLHttpRequest(XHR)有什么不同。我个人觉得,Fetch最让人省心的地方就是它基于Promise的设计,这直接解决了XHR时代复杂的回调嵌套问题。XHR需要手动监听各种事件(

onload

,

onerror

,

onprogress

),代码写起来比较冗长,而且处理异步逻辑时很容易陷入“回调地狱”。Fetch则通过

.then().catch()

链式调用,让异步流程清晰明了,配合

async/await

更是简洁得不像话。

另一个关键区别是,Fetch API默认不发送或接收cookies,除非你明确设置了

credentials

选项。这在处理跨域请求时尤其重要,它提供了更细粒度的控制。此外,Fetch的API设计更贴近HTTP语义,比如

Response

对象直接提供了

ok

属性来判断响应是否成功(2xx状态码),而不需要你手动检查

status

码范围。但话说回来,Fetch也并非完美无缺,比如它不像XHR那样可以直接监听上传进度(

onprogress

),或者直接取消请求(虽然现在有了

AbortController

来弥补)。

如何处理Fetch请求中的错误和异常?

错误处理在任何网络请求中都是一个核心环节。Fetch API在这方面,我得提醒一句,它默认情况下,即使服务器返回了4xx或5xx的HTTP错误状态码(比如404 Not Found或500 Internal Server Error),

fetch()

返回的Promise也不会被reject。它只有在网络错误(比如断网、DNS解析失败)或者请求被阻止(比如CORS策略)时才会reject。

所以,为了捕获HTTP错误,你需要在第一个

.then()

块里手动检查

Response

对象的

ok

属性。

response.ok

是一个布尔值,如果HTTP状态码在200-299范围内,它就是

true

。否则,你就需要手动抛出一个错误,让后续的

.catch()

块来处理。

fetch('https://api.example.com/nonexistent-endpoint')  .then(response => {    if (!response.ok) {      // 这里的response.status就是404,response.statusText可能是"Not Found"      throw new Error(`服务器返回错误: ${response.status} ${response.statusText}`);    }    return response.json(); // 或者response.text(),根据实际情况  })  .then(data => console.log(data))  .catch(error => {    // 这个catch会捕获网络错误,也会捕获上面手动throw的HTTP错误    console.error('请求失败或处理响应时出错:', error.message);  });

这种分离处理 HTTP 错误和网络错误的方式,一开始可能会让人有点不适应,但它确实提供了更细致的错误分类能力。网络错误通常是不可恢复的,而HTTP错误则可能需要根据具体的状态码进行不同的业务逻辑处理。

Fetch API在实际开发中有哪些高级用法?

Fetch API在日常开发中远不止GET和POST那么简单,它有很多高级用法能让你的网络请求更灵活、更强大。

取消请求 (AbortController): 这绝对是Fetch一个非常重要的补充。想想看,如果你在做一个搜索框,用户快速输入,每次输入都发请求,之前的请求就没必要继续了。

AbortController

就是为此而生。

const controller = new AbortController();const signal = controller.signal;setTimeout(() => controller.abort(), 5000); // 5秒后取消请求fetch('https://api.example.com/long-running-task', { signal })  .then(response => response.json())  .then(data => console.log('数据:', data))  .catch(error => {    if (error.name === 'AbortError') {      console.log('Fetch请求被取消了。');    } else {      console.error('Fetch错误:', error);    }  });

发送表单数据 (FormData): 如果你需要上传文件或者发送复杂的表单数据,

FormData

对象是你的好帮手。它会自动设置

Content-Type

multipart/form-data

,你不需要手动去处理。

const formData = new FormData();formData.append('username', 'JohnDoe');formData.append('profilePicture', myFileInput.files[0]); // myFileInput是元素fetch('https://api.example.com/upload', {  method: 'POST',  body: formData // 直接传递FormData对象}).then(response => response.json()).then(data => console.log('上传成功:', data)).catch(error => console.error('上传失败:', error));

处理不同类型的响应体: 除了

.json()

Response

对象还提供了

.text()

(获取纯文本)、

.blob()

(获取二进制大对象,常用于文件下载)、

.arrayBuffer()

(获取通用的二进制数据缓冲区)等方法,满足你对不同数据格式的需求。

自定义Request和Response对象: 你甚至可以先创建

Request

对象,再把它传给

fetch()

,这在需要复用相同请求配置或者拦截请求时很有用。

const myRequest = new Request('https://api.example.com/data', {  method: 'GET',  headers: {    'X-Custom-Header': 'MyValue'  }});fetch(myRequest)  .then(response => response.json())  .then(data => console.log('自定义请求获取的数据:', data));

类似地,你也可以创建一个

Response

对象来模拟响应,这在测试或Service Worker中非常有用。

这些高级用法让Fetch API在各种复杂的Web应用场景中都能游刃有余,它提供了一个强大而灵活的基础,供我们构建健壮的网络层。

以上就是Fetch API如何使用的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1516350.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 09:59:32
下一篇 2025年12月20日 09:59:38

相关推荐

  • 高效处理嵌套 JSON 数据:JavaScript 技巧与实践

    本文旨在帮助开发者高效地从嵌套 JSON 对象中提取并整理数据,特别是针对需要扁平化数据结构并获取唯一值的情况。我们将通过一个实际示例,展示如何使用 JavaScript 的 reduce 方法和辅助函数,避免多重循环,从而优化数据处理的性能,最终获得清晰、易于访问的数据结构。 理解问题:嵌套 JS…

    2025年12月20日
    000
  • JavaScript递归函数中数组引用陷阱解析与浅拷贝实践

    本文深入探讨JavaScript递归函数中处理数组时常见的引用陷阱。当在递归过程中将一个动态变化的数组直接推入结果集时,由于JavaScript的对象引用特性,最终可能得到空数组或不符合预期的结果。文章通过一个经典的子集生成问题为例,详细解释了为何需要使用Array.prototype.slice(…

    2025年12月20日
    000
  • 优化JavaScript中嵌套对象的数据提取与扁平化

    本文旨在探讨如何高效地从深度嵌套的JavaScript对象中提取并扁平化数据,特别是针对需要获取各层级唯一值的场景。我们将详细介绍如何利用Array.prototype.reduce()方法结合辅助函数,以单次遍历的方式优化数据处理流程,避免传统多层循环带来的性能损耗,并提供具体示例代码与使用注意事…

    2025年12月20日
    000
  • 优化 JavaScript 中嵌套对象的数据提取

    本文旨在提供一种高效的方法,用于从嵌套的 JavaScript 对象中提取数据,并生成包含唯一值的扁平化结构。通过使用 reduce 和辅助函数,我们可以避免多重循环,从而显著提高性能。本文将提供详细的代码示例和解释,帮助开发者理解和应用这种优化技术。 在处理复杂的数据结构时,尤其是在前端开发中,经…

    2025年12月20日
    000
  • 实现水平滚动文本的淡出效果

    本文将介绍如何使用 CSS 实现水平滚动文本的淡出效果,尤其是在非均匀背景下,传统线性渐变方案不适用的情况下。我们将通过结合 linear-gradient 和 background-clip 属性,创建一个在水平滚动时两侧逐渐淡出的文本效果。 实现原理 核心思路是利用 CSS 的 linear-g…

    2025年12月20日 好文分享
    000
  • js 如何用maxBy获取对象数组的最大值

    当对象数组为空时,maxby 返回 undefined 或可选择抛出错误;若多个对象属性值相同且最大,则返回第一个遇到的对象;该方法时间复杂度为 o(n),可通过避免重复计算或使用高效遍历方式优化,但需权衡实现复杂性与实际性能需求。 获取 JavaScript 对象数组中的最大值,通常需要指定一个属…

    2025年12月20日
    000
  • 回溯算法是什么?回溯算法的实现步骤

    回溯算法是一种通过试探与剪枝求解问题的方法,先定义解空间并逐步构建解,若当前路径无法满足约束则回溯至前一状态尝试其他可能;其实现常依赖递归,但核心在于“试探-回溯”机制,而非仅函数自调用;相比普通递归,回溯强调状态的撤销与路径探索;优化主要通过剪枝实现,如预判约束、排序优先级、记忆化搜索和迭代加深;…

    2025年12月20日
    000
  • js如何实现节流函数

    节流函数的核心是限制函数在单位时间内的执行次数,通过管理定时器和时间戳实现;1. 使用 date.now() 记录上次执行时间,判断是否超过延迟周期;2. 若未超过,则清除已有定时器并设置新的延时执行(确保末次触发有效);3. 若已超过,则立即执行函数并重置时间戳;4. 始终通过 func.appl…

    2025年12月20日
    000
  • js 如何使用sort对数组进行排序

    javascript中对数组排序最直接的方法是使用sort()方法,但需注意其默认将元素转为字符串比较,可能导致数字排序异常;1. 使用比较函数可实现数字升序(a – b)或降序(b – a);2. 字符串排序推荐使用localecompare()以支持本地化和忽略大小写;3…

    2025年12月20日
    000
  • Web动画API与滚动驱动动画:掌握新语法实现多元素独立动画

    本文深入探讨Web动画API与滚动驱动动画的实现,特别针对旧语法导致多元素动画失效的问题。我们将详细介绍滚动驱动动画规范的最新变化,包括animation-timeline、scroll-timeline等核心CSS属性,并通过示例代码演示如何正确地为多个元素创建独立的、基于视口进出的动画效果,确保…

    2025年12月20日
    000
  • js如何判断属性是否可被原型访问

    判断javascript对象的属性是否通过原型链访问的核心方法是:1. 使用 object.hasown(obj, prop) 返回 false 且 prop in obj 返回 true,则属性来自原型链;2. 可通过 object.getprototypeof 递归遍历原型链以定位属性所在原型层…

    2025年12月20日 好文分享
    000
  • 什么是懒加载?懒加载的实现

    懒加载的核心目的是提升网页初始加载速度和用户体验,减少不必要的资源消耗,其最推荐的实现方式是结合html的loading=”lazy”属性和javascript的intersection observer api。对于图片和iframe,可直接使用原生loading=&#82…

    2025年12月20日
    000
  • js如何实现动画效果

    javascript实现动画的核心是通过代码连续、平滑地改变元素样式属性,创造视觉运动效果;2. 最佳实践是使用requestanimationframe,因其与浏览器重绘同步、节能且精准;3. web animations api(waapi)通过声明式关键帧和javascript控制结合,简化复…

    2025年12月20日
    000
  • JS如何实现迭代器?迭代器协议

    JavaScript中实现迭代器需遵循可迭代协议和迭代器协议,通过定义[Symbol.iterator]方法返回具备next()方法的迭代器对象,从而支持for…of和展开运算符;该机制统一了数据结构的遍历接口,实现惰性求值,适用于自定义对象、树、图及无限序列等复杂场景,提升代码通用性与…

    2025年12月20日
    000
  • JS如何实现Promise调度?Promise的执行顺序

    promise调度的核心在于微任务队列的高优先级,即promise的then、catch、finally回调被放入微任务队列,在当前宏任务结束后立即执行,因此比settimeout等宏任务更早执行;promise构造函数内的同步代码会立即执行,而其回调通过事件循环机制在微任务阶段处理,确保异步操作的…

    2025年12月20日
    000
  • Web Animation API 滚动驱动动画:从旧语法到新规范的演进与实践

    本文深入探讨了如何利用 Web Animation API (WAAPI) 实现高性能的滚动驱动动画。文章揭示了早期示例中常见语法过时的问题,并详细介绍了当前滚动驱动动画规范的最新语法与实现方式。通过代码示例,读者将学习如何为多个元素创建基于滚动进度的动画,同时涵盖了浏览器兼容性、polyfill …

    2025年12月20日
    000
  • 如何实现JS栈结构?栈的应用场景有哪些

    答案:JS栈在程序执行中管理函数调用顺序,通过调用栈实现执行上下文的压入与弹出,确保函数调用正确性,并应用于撤销/重做、浏览器前进后退、表达式求值和深度优先搜索等场景。 在JavaScript中实现一个栈结构,最直接也最常用的方式就是基于数组。栈本质上是一种“后进先出”(LIFO)的数据结构,就像一…

    2025年12月20日
    000
  • js如何检测原型链上的私有属性

    javascript中“私有属性”包含三种实现方式:es2022的#私有字段(真正私有、实例专属、不可检测)、下划线_前缀(约定私有、可检测)、闭包封装(作用域私有、非属性、不可检测);2. 无法检测原型链上的私有属性,因为#私有字段不在原型链上且外部不可见,闭包私有数据不是对象属性,而_前缀属性虽…

    2025年12月20日 好文分享
    000
  • 掌握现代滚动驱动动画:从旧语法到新实践

    本文深入探讨了现代Web滚动驱动动画(Scroll-Driven Animations, SDA)的核心概念与最新语法。针对旧版@scroll-timeline语法已废弃导致动画失效的问题,文章详细介绍了如何利用scroll-timeline、animation-timeline和animation…

    2025年12月20日
    000
  • SessionStorage有何区别

    SessionStorage与LocalStorage的核心区别在于生命周期和共享范围:前者仅在当前会话的单个标签页内有效,关闭即消失,适合临时状态存储;后者持久化保存,跨会话存在,且同源下所有标签页共享,适用于长期数据留存。 SessionStorage和LocalStorage最核心的区别在于它…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信