Fetch API 规范使用需显式设置 credentials、手动校验 response.ok、一次读取响应体、用 AbortController 处理超时与取消,并统一错误结构。

Fetch API 是现代 JavaScript 中发起网络请求的标准方式,它基于 Promise,语法简洁,支持流式响应处理,但默认不带 Cookie、不自动抛错,需手动处理状态码和错误边界——这些正是规范使用的重点。
请求发起:设置基础选项与凭证
发起请求时,必须显式指定 credentials 选项,否则跨域请求默认不携带 Cookie,登录态会丢失。常见取值为 'include'(始终发送)、'same-origin'(同源才发)或 'omit'(从不发)。
- GET 请求可省略
method,但建议显式写出,提升可读性 - POST/PUT 等需提交数据时,根据内容类型设置
headers并正确序列化body:JSON 数据用JSON.stringify()+'Content-Type': 'application/json';表单数据用FormData实例(自动设置 boundary) - 避免直接将对象赋给
body,fetch 不会自动转换,会导致 TypeError
响应判断:区分网络失败与业务失败
fetch 只在网络层面失败(如断网、DNS 失败、AbortError)时才拒绝 Promise;HTTP 状态码如 404、500 仍会进入 then,需手动检查 response.ok 或 response.status。
-
response.ok === true等价于status在 200–299 范围内,是推荐的状态校验方式 - 对非 2xx 响应,应调用
response.json()或response.text()获取错误详情,再抛出自定义错误便于上层捕获 - 不要仅靠
catch捕获所有异常——它抓不到 4xx/5xx,容易掩盖业务逻辑问题
响应体读取:一次且仅一次
Response 对象的 json()、text()、blob() 等方法返回 Promise,且每个方法只能调用一次。重复调用会返回已 resolve 的 Promise,但内容为空(如第二次 json() 返回空对象)。
立即学习“Java免费学习笔记(深入)”;
- 若需多次使用响应数据,应在首次读取后缓存结果,例如:
const data = await response.json();,后续直接使用data - 流式处理大文件时,可用
response.body获取 ReadableStream,配合getReader()分块读取,避免内存溢出 - 未读取的响应体会在垃圾回收时自动释放,但保持连接打开可能影响性能,建议明确消费
错误统一处理与取消机制
真实场景中需兼顾超时、用户取消、竞态请求等。原生 fetch 不支持超时,需结合 AbortController 实现。
- 创建
const controller = new AbortController();,传入signal: controller.signal到 fetch 选项中 - 调用
controller.abort()可主动终止请求,触发AbortError,适合页面卸载、搜索框防抖等场景 - 超时可通过
setTimeout(() => controller.abort(), ms)模拟,注意清除定时器防止内存泄漏 - 封装请求函数时,建议统一返回标准化结构(如
{ data, error, isLoading }),便于 React/Vue 等框架消费
不复杂但容易忽略——规范不在语法多炫酷,而在每一步是否考虑了边界、可维护性和协作一致性。


















