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() 分块读取和处理数据流,有效避免内存溢出。

相关推荐
FungLeo18 分钟前
成为全栈·Vue 管理后台篇·分类树与标签管理:层级数据如何落到管理界面
前端·javascript·vue.js·分类树·naive ui·标签管理·前端数据结构
总要学点什么1 小时前
第108篇:三维特效-图片轨迹线效果——把贴图滚成一串箭头,想用它的本色反而整条消失
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
Lank_M4 小时前
白底都占八成,PNG 为何只在图表页赢过 JPG
前端
张一凡934 小时前
给 Coding Agent 加一道"架构闸门":Jin 是如何做到"先审架构、再写代码、不漂移"的
前端·后端·agent
Linye4 小时前
AI 写的 HTML 原型全是空壳?聊聊真实 DOM 交互避坑
前端·人工智能
ZANE4 小时前
纯前端实现的 PDF 与图片互相转换工具技术实现
前端
Swot4 小时前
SvelteKit Remote Functions 使用指南
前端·后端
Cooper254 小时前
三源热榜去重加 AI 摘要:URL 唯一键踩出的三个坑
前端·python
Yk酱228404 小时前
A2UI探索随笔-技术选型
前端
前端繁华如梦5 小时前
# 从 73000 行压缩代码到 TypeScript 模块化:我把一个 Three.js FPS 游戏 1:1 复刻了一遍
前端