深入理解 Fetch API 的工作原理与错误处理
核心概念
Fetch API 提供了一种现代、基于 Promise 的方式来进行网络请求。它的设计遵循 分离关注点 原则,分为 获取响应 和 解析数据 两个主要阶段。
1. 基本用法
fetch(url)
.then(response => response.json()) // 解析 Response 为 JSON
.then(data => console.log(data)) // 处理解析后的数据
.catch(error => console.error(error)); // 捕获整个链的错误fetch()返回一个Promise,解析为Response对象。- 第一个
.then()处理Response,检查状态码(response.ok),并调用.json()/.text()/.blob()解析数据。 - 第二个
.then()处理解析后的数据(如 JSON 对象)。 .catch()捕获整个链中的任何错误(网络错误、HTTP 错误、解析错误等)。
2. 为什么需要两个 .then()?
阶段 1:获取原始响应(Response)
fetch返回的Promise解析为Response对象,包含 HTTP 状态、headers 等信息。- 必须手动检查
response.ok或response.status,因为 HTTP 错误(404、500)不会自动触发.catch()。
阶段 2:解析数据
response.json()/.text()/.blob()返回新的Promise,因为解析可能是异步的。- 第二个
.then()接收解析后的数据(如 JSON 对象)。
类比:拆快递
- 签收快递(第一个
.then()):检查包裹是否完好(response.ok)。 - 拆包裹(
.json()):解析内容(返回新的Promise)。 - 使用商品(第二个
.then()):处理实际数据。
3. 错误处理机制
.catch() 捕获哪些错误?
- 网络错误(如无法连接服务器、CORS 问题)。
- HTTP 错误(需手动检查
response.ok并throw)。 - 解析错误(如无效 JSON)。
- 业务逻辑错误(在
.then()中手动抛出)。
如何区分不同错误?
.catch(error => {
if (error instanceof TypeError) {
console.error("网络错误或无效 URL");
} else if (error instanceof SyntaxError) {
console.error("JSON 解析失败");
} else {
console.error("其他错误", error);
}
});最佳实践
始终检查
response.ok:if (!response.ok) throw new Error(`HTTP ${response.status}`);拆分错误处理(如需精细控制):
fetch(url) .then(handleResponse) // 单独处理 HTTP 错误 .then(handleData) // 处理数据 .catch(handleNetworkError); // 捕获网络错误
4. 高级技巧
取消请求(AbortController)
const controller = new AbortController();
fetch(url, { signal: controller.signal })
.then(response => response.json())
.catch(error => {
if (error.name === 'AbortError') {
console.log("请求被取消");
}
});
// 取消请求
controller.abort();POST 请求示例
fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ key: 'value' }),
});总结
fetch返回Promise<Response>,需用.then()处理。两个
.then()分工明确:- 第一个处理
Response(HTTP 层面)。 - 第二个处理解析后的数据(业务层面)。
- 第一个处理
.catch()捕获整个链的错误,需手动检查 HTTP 错误。- 灵活运用
AbortController、headers和body可满足复杂需求。
新项目准备上线,寻找志同道合的合作伙伴
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘首开 新盘首开 征召客户!!!
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳东方明珠客服电话是多少?(▲18288362750?《?微信STS5099? 】
如何联系华纳东方明珠客服?(▲18288362750?《?微信STS5099? 】
华纳东方明珠官方客服联系方式?(▲18288362750?《?微信STS5099?
华纳东方明珠客服热线?(▲18288362750?《?微信STS5099?
华纳东方明珠24小时客服电话?(▲18288362750?《?微信STS5099? 】
华纳东方明珠官方客服在线咨询?(▲18288362750?《?微信STS5099?
华纳东方明珠客服电话是多少?(▲18288362750?《?微信STS5099? 】
如何联系华纳东方明珠客服?(▲18288362750?《?微信STS5099? 】
华纳东方明珠官方客服联系方式?(▲18288362750?《?微信STS5099?
华纳东方明珠客服热线?(▲18288362750?《?微信STS5099?
华纳东方明珠24小时客服电话?(▲18288362750?《?微信STS5099? 】
华纳东方明珠官方客服在线咨询?(▲18288362750?《?微信STS5099?
华纳东方明珠客服电话是多少?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
华纳东方明珠开户专线联系方式?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
华纳东方明珠客服电话是多少?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
华纳东方明珠开户专线联系方式?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】