await fetch() 的两阶段设计

await fetch() 的两阶段设计

结论

await fetch() 只等待响应头(Headers)返回,不包含完整的响应体(Body)。

设计原理

Fetch API 采用两阶段设计,以提升效率和灵活性:

第一阶段:等待响应头

执行 await fetch(url) 时,JavaScript 会暂停,直到服务器返回 HTTP 状态码和响应头。此时 Promise 变为 fulfilled,你得到一个 Response 对象,其中包含:

  • status(如 200)
  • ok
  • headers

响应体的数据流可能还在传输中

第二阶段:等待响应体

获取 Response 对象后,需要显式调用 response.json()response.text()response.blob() 等方法来读取响应体。这些方法本身也返回一个 Promise,需要第二个 await 来等待数据流读取和解析完成。

代码示例

javascript 复制代码
async function getData() {
  try {
    // 第一个 await:等待响应头,获取 Response 对象
    const response = await fetch('https://api.example.com/data');

    // 此时可以立即检查响应状态
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }

    // 第二个 await:等待响应体被完全读取和解析
    const data = await response.json();

    console.log('数据获取成功:', data);
  } catch (error) {
    console.error('请求失败:', error);
  }
}

这种设计的两大好处

  1. 快速错误处理:在下载可能很大的响应体之前,就能根据状态码(如 404 或 500)快速判断请求是否成功,节省带宽和时间。

  2. 流式处理 :对于大文件,可以不一次性加载到内存,而是通过 response.body.getReader() 分块读取和处理数据流,有效避免内存溢出。

相关推荐
海兰5 分钟前
【文字三国志:第五篇】天命重构,游戏前端UI设计
前端·人工智能·游戏·语言模型
时寒的笔记7 分钟前
LF11期_day19~20 补环境(二)入门案例
javascript
海鸥-w7 分钟前
前端学习python第二天手敲笔记整理
前端·python·学习
爱吃提升12 分钟前
Figma 组件库搭建清单(含命名规范+常用组件模板)
前端·javascript·figma
广州华水科技14 分钟前
单北斗GNSS形变监测一体机在地质灾害监测中的应用与优势
前端
古韵17 分钟前
从 Axios 到 alova:一个页面从 80 行到 5 行的故事
前端·后端
右耳朵猫AI19 分钟前
JavaScript技术周刊 2026年第20周
开发语言·javascript·ecmascript
Cobyte31 分钟前
15.响应式系统比对:链表在 Preact Signals 响应式系统中的应用
前端·javascript·vue.js
KaMeidebaby35 分钟前
卡梅德生物技术快报|基因测序技术在 46,XY 性发育障碍变异筛查中的流程与数据分析
服务器·前端·数据库·人工智能·算法·数据挖掘·数据分析
ZengLiangYi37 分钟前
SourceAdapter 插件架构详解
javascript·算法·架构