JavaScript 的 fetch API 广泛用于发出 HTTP 请求,但理解为什么它有时需要两个 wait 语句可能有点棘手。如果您以前使用过 fetch,您可能遇到过如下代码:
const response = await fetch('https://api.example.com/data'); const data = await response.json();
让我们分解一下并理解为什么这种模式是必要的。 ?
获取的两步过程?️
fetch API 旨在异步处理网络请求,但其行为分为两个主要阶段:
-
获取响应 ?
- 当你调用 fetch 时,它会返回一个 Promise,一旦网络请求完成,该 Promise 就会解析为 Response 对象。
- 此步骤不处理响应正文;它仅确保请求成功并且标头可用。
-
阅读响应正文 ?
- Response 对象具有 .json()、.text() 和 .blob() 等方法来读取实际内容。
- 这些方法还返回 Promises,因为读取正文是异步的。这是有效处理大型负载而不阻塞主线程所必需的。
第一次等待期间会发生什么? ⏳
当您编写 const response = wait fetch(url); 时,会发生以下情况:
-
已发送网络请求: ?
- 浏览器向指定的URL发起HTTP请求。
- 这涉及解析域名、建立 TCP 连接以及发送 HTTP 标头和正文(对于 POST 请求)。
-
收到响应元数据: ?
- 一旦服务器响应状态行(例如,HTTP/1.1 200 OK)和标头,提取调用就会解析。在此刻:
- 状态(例如 200、404 或 500)和状态文本(例如“确定”或“未找到”)可用。
- 响应标头(例如 Content-Type、Content-Length)以及服务器发送的任何自定义标头都是可访问的。
- 一旦服务器响应状态行(例如,HTTP/1.1 200 OK)和标头,提取调用就会解析。在此刻:
-
已创建响应对象: ?️
- 浏览器构造一个 Response 对象,其中包含有关响应的元数据。这包括:
- 标头:可通过response.headers访问,它允许您检查特定标头,例如内容类型或授权。
- 正文: 此时,正文尚未完全读取或解析 - 它仍然是可读流。
- 浏览器构造一个 Response 对象,其中包含有关响应的元数据。这包括:
例如,如果服务器返回:
HTTP/1.1 200 OK Content-Type: application/json Content-Length: 123 {"message": "Hello, world!"}
响应对象将包含:
- 状态:200 ✅
- 状态文本:“确定”✅
- headers:响应头的可迭代集合(例如,Content-Type:application/json)。
- body:尚未解析的可读流。
第二次等待期间会发生什么? ?
当您编写 const data = wait response.json(); 时,会发生以下步骤:
-
身体流阅读: ?
- 响应正文(仍为原始形式)作为流读取。根据您使用的方法,原始数据会进行相应的处理:
- .json():将流解析为 JSON 并返回 JavaScript 对象。
- .text():将流读取为纯文本字符串。
- .blob():将流读取为二进制大对象。
- 响应正文(仍为原始形式)作为流读取。根据您使用的方法,原始数据会进行相应的处理:
-
解析和解析: ?
- json() 方法将原始数据(例如,{"message": "Hello, world!"})解析为可用的 JavaScript 对象(例如,{ message: "Hello, world!" })。
- 此解析过程是异步的,因为它涉及处理潜在的大数据。
-
承诺决议: ✅
- response.json() 返回的 Promise 解析为解析后的数据,然后可以在您的应用程序中使用该数据。
为什么需要两个await语句?
这是您需要等待两次的原因:
-
首先等待(等待响应):
- fetch 调用不会立即提供响应数据;它给了你一个承诺。您需要等待它才能获取 Response 对象。
-
第二次等待(解析正文):
- .json() 方法(或其他正文读取方法)返回另一个 Promise。您需要等待此操作才能提取解析的内容。
如果您跳过任一等待,您可能会出现意想不到的行为:
- 跳过第一个等待:您将使用未解决的 Promise,而不是实际的 Response 对象。
- 跳过第二个等待:你将得到一个 Promise,而不是解析后的数据。
错误处理示例?️
以下是在使用 fetch 时正确处理错误的方法:
const response = await fetch('https://api.example.com/data'); const data = await response.json();
常见陷阱⚠️
-
不处理错误:
- fetch 不会抛出 404 或 500 等 HTTP 错误。您必须手动检查 response.ok 或 response.status。
-
跳过第二个等待:
- 忘记等待 .json() 可能会导致您使用 Promise 而不是实际数据时出现错误。
-
fetch 和旧版 API 之间的混淆:
- 从 XMLHttpRequest 等旧 API 过渡的开发人员可能期望同步行为,但 fetch 完全基于 Promise。
结论 ?
在 fetch 中使用两个await语句乍一看似乎有些多余,但这是其异步设计的逻辑结果。第一个等待确保已收到响应,包括标头和元数据,而第二个等待处理响应正文。了解此流程有助于您编写更可靠且可维护的异步代码。 ?
以上是理解为什么 Fetch 需要等待两次✨的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript在现实世界中的应用包括服务器端编程、移动应用开发和物联网控制:1.通过Node.js实现服务器端编程,适用于高并发请求处理。2.通过ReactNative进行移动应用开发,支持跨平台部署。3.通过Johnny-Five库用于物联网设备控制,适用于硬件交互。

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Dreamweaver CS6
视觉化网页开发工具

WebStorm Mac版
好用的JavaScript开发工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

记事本++7.3.1
好用且免费的代码编辑器