fetch API 的用法和特点是什么?如何取消 fetch 请求?
请说明 fetch API 的基本用法、请求配置、响应处理,以及如何使用 AbortController 取消请求。
回答
孤独的心
基本用法:
const response = await fetch('https://api.example.com/data', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ key: 'value' }),
credentials: 'include', // 跨域携带 Cookie
signal: controller.signal // 取消信号
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
特点:
- 基于 Promise,更简洁现代
- 默认不带 Cookie(需
credentials: 'include') - 网络错误才 reject,HTTP 4xx/5xx 不 reject(需检查
response.ok) - 不提供超时机制(需配合 AbortController 或 Promise.race)
- 支持 Stream(
response.body.getReader()流式读取)
取消请求(AbortController):
const controller = new AbortController();
// 3 秒超时
setTimeout(() => controller.abort(), 3000);
try {
const res = await fetch(url, { signal: controller.signal });
} catch (err) {
if (err.name === 'AbortError') console.log('请求已取消');
}
fetch vs axios:
- fetch 是原生 API,无需安装
- axios 自动 JSON 解析、超时、拦截器、CSRF 保护更完善
- fetch 的请求取消需手动 AbortController