浏览器 API 【详解】fetch fetch是浏览器原生网络请求API用来代替XMLHttpRequest返回 Promise不是第三方库不用安装。❗注意fetch只有网络异常才会 rejectHTTP 404/500 不会抛异常这点和axios不一样。基础语法fetch(resource,options).then(response{}).catch(error{})resourceurl字符串options配置对象method、headers、body等返回PromiseResponse对象Response 对象常用属性response.ok// boolean状态码200‑299为true404/500也是okfalse不会进catchresponse.status// http状态码 200、404、500response.json()// 解析响应为JSON返回Promiseresponse.text()// 获取原始文本response.blob()// 文件二进制response.headers// 响应头1. GET 请求最简单asyncfunctiongetDemo(){try{constresawaitfetch(https://jsonplaceholder.typicode.com/todos/1)// fetch 404/500不会抛出错误需要手动判断okif(!res.ok)thrownewError(HTTP错误:${res.status})constdataawaitres.json()console.log(data)}catch(err){// 网络断网、跨域才会走到这里console.error(请求失败,err)}}getDemo()2. POST 请求发送JSONPOST发JSON必须手动设置headers:{Content‑Type:application/json}body要JSON.stringify()asyncfunctionpostDemo(){constpayload{title:hello,body:world,userId:1}try{constresawaitfetch(https://jsonplaceholder.typicode.com/posts,{method:POST,headers:{Content-Type:application/json},body:JSON.stringify(payload)})if(!res.ok)thrownewError(res.status)constdataawaitres.json()console.log(返回结果,data)}catch(e){console.error(e)}}postDemo()3. 提交表单 FormData上传文件/表单不要手动设置Content‑Type浏览器会自动带上boundaryasyncfunctionformDataDemo(){constformDatanewFormData()formData.append(username,zhangsan)// formData.append(file, fileObj) // 上传文件constresawaitfetch(/api/upload,{method:POST,body:formData})constdataawaitres.json()}4. 常用配置项完整示例fetch(url,{method:GET,// GET POST PUT DELETE PATCHheaders:{Content-Type:application/json,token:xxxxxx// 请求头携带token},body:JSON.stringify({a:1}),// GET不要写bodymode:cors,// cors、no‑cors、same‑origincredentials:include,// 携带cookieinclude跨域也带same‑origin仅同源signal:abortSignal,// 取消请求}) 取消 fetch 请求AbortController非常常用React组件卸载要取消请求防止setState在卸载组件执行报错asyncfunctionabortDemo(){constcontrollernewAbortController()constsignalcontroller.signal// 500ms后取消请求setTimeout(()controller.abort(),500)try{constresawaitfetch(https://jsonplaceholder.typicode.com/todos/1,{signal})constdataawaitres.json()console.log(data)}catch(err){if(err.nameAbortError){console.log(请求被手动取消)}}}abortDemo()React中使用组件卸载取消请求useEffect((){ const controller new AbortController() const signal controller.signal async function loadData(){ const res await fetch(/api/list, {signal}) } loadData() // effect清理函数组件卸载执行abort return () controller.abort() }, [])fetch vs axios 重点区别面试特性fetchaxios依赖浏览器原生无需安装第三方库错误处理404/500不会reject要判断ok非2xx直接进入catch拦截器无需要自己封装内置请求/响应拦截器超时无timeout靠AbortController模拟直接timeout配置转换数据手动 res.json()自动解析JSON取消请求AbortControllercancelToken / AbortController✨ 简易封装fetch项目里可以直接用asyncfunctionrequest(url,options{}){constbaseUrlconstheaders{Content-Type:application/json,...options.headers}// token示例 headers.Authorization Bearer ${localStorage.getItem(token)}constresawaitfetch(baseUrlurl,{...options,headers})if(!res.ok){thrownewError(http:${res.status})}returnres.json()}// 使用// request(/api/todo,{method:GET})// .then(dconsole.log(d))⚠️ 坑总结HTTP 4xx、5xx 不会触发catch必须手动判断!res.okPOST JSON必须JSON.stringify设置Content‑Type:application/jsonFormData不要手动设置Content‑Type组件卸载记得AbortController.abort()取消请求避免内存泄漏fetch不支持Node.js低版本Node18才内置fetch旧node需要安装node‑fetch包。实战范例重点留意范例代码中的多层错误处理useEffect((){// 使用原生 fetch 获取数据fetch(http://localhost:5293/api/products?keywordMacBook).then((response){if(!response.ok){// 如果响应状态码不是 2xx 范围的成功响应抛出错误throw newError(Failed to fetch data);}returnresponse.json();// 如果成功解析 JSON}).then((data){if(data.code!200)throw newError(data.message);returndata;});},[]);

相关新闻

最新新闻

微前端接入全局 AI 助手:上下文隔离与生命周期回收

微前端接入全局 AI 助手:上下文隔离与生命周期回收

微前端接入全局 AI 助手:上下文隔离与生命周期回收 全局 AI 助手跨越多个子应用时,真正麻烦的是事件订阅和上下文归属。路由切换后若旧连接没有释放,就会重复消费消息。本文用主应用代理、命名空间和销毁钩子把生命周期说清楚。 1. 产生工程落…

2026/8/16 9:24:08
本地缓存实战:从Caffeine原理到多级缓存架构设计

本地缓存实战:从Caffeine原理到多级缓存架构设计

1. 从一次线上事故说起:本地缓存的“双刃剑”效应 去年我负责的一个核心服务,在某个周一早高峰毫无征兆地挂了。监控面板上,数据库连接池瞬间被打满,CPU和内存使用率飙升,整个服务响应时间从几十毫秒飙升到几十秒&…

2026/8/16 9:24:08
嵌入式设备联网不发愁:MQTT-C 两个源文件跑通轻量级 C 语言 MQTT 客户端

嵌入式设备联网不发愁:MQTT-C 两个源文件跑通轻量级 C 语言 MQTT 客户端

嵌入式设备联网不发愁:MQTT-C 两个源文件跑通轻量级 C 语言 MQTT 客户端 【免费下载链接】MQTT-C A portable MQTT C client for embedded systems and PCs alike. 项目地址: https://gitcode.com/gh_mirrors/mq/MQTT-C 做物联网开发的工程师大多遇到过同样的…

2026/8/16 9:24:08
MQTT-C 实战指南:不到2000行C代码,让嵌入式设备轻松接入物联网

MQTT-C 实战指南:不到2000行C代码,让嵌入式设备轻松接入物联网

MQTT-C 实战指南:不到2000行C代码,让嵌入式设备轻松接入物联网 【免费下载链接】MQTT-C A portable MQTT C client for embedded systems and PCs alike. 项目地址: https://gitcode.com/gh_mirrors/mq/MQTT-C 如果你做过嵌入式联网开发&#xff…

2026/8/16 9:24:08
端侧推理运营:先保温控、内存和回退,再谈模型效果

端侧推理运营:先保温控、内存和回退,再谈模型效果

端侧推理运营:先保温控、内存和回退,再谈模型效果 模型在桌面跑通,放到手机或掌机上还要面对共享内存、温控降频和前后台切换。运营阶段应把设备状态和推理结果关联起来。 运行边界 限制模型常驻内存、并发与输入大小,加载失败返回…

2026/8/16 9:24:08
Vue 3 页面卡顿排查:响应式依赖、长任务与列表渲染

Vue 3 页面卡顿排查:响应式依赖、长任务与列表渲染

Vue 3 页面卡顿排查:响应式依赖、长任务与列表渲染 Vue 3 页面卡顿可能来自响应式依赖过宽、主线程长任务或一次渲染太多节点。先量出三者各自占比,再选择 shallowRef、Worker 或虚拟列表。 1. 掉帧与主线程阻塞排查链路 可以使用 Chrome DevTools 的 Pe…

2026/8/16 9:19:08