09 Vue 3 接口请求与异步容错
Vue 3 接口请求与异步容错一、页面数据从哪里来真实 Vue 页面通常不会把全部数据写死在组件中而是从后端获取Vue 页面 ↓ 调用 API 封装函数 ↓ 发送 HTTP 后端服务 ↓ 返回 JSON Vue 更新 ref ↓ 模板和计算属性自动更新页面组件应关注“什么时候请求、如何保存结果、失败时如何展示”具体请求地址和 HTTP 配置通常封装到api目录。二、封装 API 函数importrequestfrom/utils/request;exportfunctiongetHeatDetail(heatId:string){returnrequest({url:/bof/heat/${heatId},method:get});}带查询参数exportfunctiongetHeatPlayback(heatId:string,params:{interval_seconds:number;signals:string;}){returnrequest({url:/bof/heat/${heatId}/playback,method:get,params});}页面中只调用const{data}awaitgetHeatDetail(heatId.value);三、async/awaitasyncfunctionloadHeatDetail(){constresponseawaitgetHeatDetail(heatId.value);heatMeta.valueresponse.data;}await会暂停当前异步函数等待 Promise 完成但不会阻塞整个浏览器线程。调用异步函数voidloadHeatDetail();或者awaitloadHeatDetail();是否等待取决于后续逻辑是否依赖结果。四、加载状态constloadingref(false);模板el-button :loadingloading clickloadData 刷新 /el-button main v-loadingloading 页面内容 /main函数asyncfunctionloadData(){loading.valuetrue;try{// 请求}finally{loading.valuefalse;}}将关闭 Loading 放在finally中能够保证成功和失败都执行。五、try/catch/finallyconsterrorMessageref();asyncfunctionloadData(){loading.valuetrue;errorMessage.value;try{const{data}awaitgetHeatDetail(heatId.value);heatMeta.valuedata;}catch(error:unknown){errorMessage.valuegetErrorMessage(error);}finally{loading.valuefalse;}}错误转换functiongetErrorMessage(error:unknown):string{if(errorinstanceofError){returnerror.message;}returnString(error);}六、首次加载与手动刷新复用同一函数onMounted((){voidloadData();});el-button clickloadData刷新/el-button这样首次加载和手动刷新不会出现两套重复逻辑。七、串行请求constdetailResultawaitgetHeatDetail(heatId.value);constplaybackResultawaitgetHeatPlayback(heatId.value);第二个请求必须等第一个完成。适合第二个请求依赖第一个结果需要明确执行顺序前一步失败后不应继续。如果两个接口相互独立串行会增加总等待时间。八、使用Promise.all()并行请求const[detailResult,playbackResult]awaitPromise.all([getHeatDetail(heatId.value),getHeatPlayback(heatId.value)]);两个请求同时发出总时间通常接近较慢请求的耗时。Promise.all()的特点任何一个 Promise 拒绝整个Promise.all()立即进入异常详情成功 回放失败 预测仍在请求 ↓ Promise.all 整体 rejected当所有数据都属于页面的必要条件时这种行为是合理的。九、使用Promise.allSettled()处理局部失败复杂大屏的各个区域可能相对独立炉次详情历史回放全流程预测线性回归预测。可以并行请求constresultsawaitPromise.allSettled([getHeatDetail(heatId.value),getHeatPlayback(heatId.value),predictFullProcess(heatId.value),predictLinearRegression(heatId.value)]);结果不会因为一个接口失败而整体抛出。判断状态const[detailResult,playbackResult]results;if(detailResult.statusfulfilled){heatMeta.valuedetailResult.value.data;}else{heatMeta.valuenull;setSectionError(详情接口失败);}if(playbackResult.statusfulfilled){playback.valueplaybackResult.value.data;}else{playback.valuenull;setSectionError(回放接口失败);}两种结果类型fulfilled → value rejected → reason十、局部容错的页面设计合理目标不是“任何失败都装作没发生”而是必要数据失败 → 阻断相关页面功能 可选数据失败 → 只降级对应区域 已有旧数据 → 必要时保留上一帧例如详情成功、回放成功、预测失败 ↓ 基础页面和回放正常显示 预测区域显示“模型服务不可达”这比整个页面白屏更符合监控系统需求。十一、错误应该分层页面级错误页面无法继续使用炉次不存在权限失败核心详情无法获取。区域级错误只有一个模块失败预测总线失败场数据失败控制状态失败。降级提示页面仍然可用但使用替代数据保留上一快照使用基础信号代替设备控制接口使用符号模型代替场数据使用历史预测结果。不同错误不应该全部写进同一个字符串否则一个区域的新错误可能覆盖另一个区域的重要提示。十二、保留上一帧实时请求失败时不一定要清空数据asyncfunctionloadSnapshot(){try{const{data}awaitgetSnapshot();snapshot.valuedata;snapshotError.value;}catch(error){snapshotError.value快照加载失败已保留上一帧。;if(!snapshot.value){showFatalError(error);}}}逻辑是已有数据 临时失败 → 保留旧数据并提示 首次请求就失败 → 显示更明显错误十三、不要在失败时无条件清空所有状态下面的做法可能让页面闪烁snapshot.valuenull;awaitloadSnapshot();更平滑的做法是保留旧值只有新请求成功后再替换。是否保留旧数据取决于业务旧数据必须同时显示时间戳或“数据已过期”提示避免被误认为实时结果。十四、请求门控与重复请求实时轮询可能在上一次请求未完成时再次触发。可以使用简单锁letsnapshotLoadingfalse;asyncfunctionloadSnapshot(){if(snapshotLoading){return;}snapshotLoadingtrue;try{const{data}awaitgetSnapshot();snapshot.valuedata;}finally{snapshotLoadingfalse;}}更复杂时可以为不同接口建立独立门控snapshot field-snapshot control-state避免一个接口的锁阻止其他独立接口。十五、请求竞争与过期结果用户快速切换炉次请求 H001 发出 请求 H002 发出 H002 先返回并显示 H001 后返回并覆盖 H002可以记录版本letloadVersion0;asyncfunctionloadHeatData(id:string){constversionloadVersion;const{data}awaitgetHeatDetail(id);if(version!loadVersion){return;}heatMeta.valuedata;}也可以使用AbortController或请求库提供的取消能力。十六、接口类型与数据校验const{data}awaitgetHeatDetail(heatId.value);heatMeta.valuedata;即使 API 函数声明了类型重要字段仍可能因后端异常缺失。可以检查if(!data||typeofdata.heat_id!string){thrownewError(模型服务字段缺失);}工业页面尤其需要区分请求失败接口成功但字段缺失字段存在但数据不可用数据可展示但不可用于模型。十七、加载函数的推荐结构asyncfunctionloadPageData(){if(!heatId.value){router.push(/heat);return;}loading.valuetrue;pageError.value;stopPlayback();stopPolling();try{const[detailResult,playbackResult,predictionResult]awaitPromise.allSettled([getHeatDetail(heatId.value),getHeatPlayback(heatId.value),getPrediction(heatId.value)]);handleDetailResult(detailResult);handlePlaybackResult(playbackResult);handlePredictionResult(predictionResult);if(displayMode.valuerealtime){awaitloadSnapshot();startPolling();}}finally{loading.valuefalse;awaitnextTick();resizeView();}}这类函数是页面数据加载的协调器。具体结果处理可以继续拆成小函数。十八、常见误区1. 所有接口都串行请求独立接口应考虑并行减少等待时间。2. 所有接口都放进Promise.all()可选模块失败时可能拖垮整个页面。3. Catch 中只打印控制台用户看不到错误页面也不知道是否应降级。4. 每个按钮都写一套请求逻辑首次加载和刷新应复用同一个函数。5. 实时轮询不处理请求重叠接口慢时会积累并发请求。6. 保留旧数据却不显示时间用户可能误把旧帧当成实时数据。十九、本章小结接口页面应建立四层能力API 封装 ↓ async/await 与加载状态 ↓ 并行请求与结果分流 ↓ 局部错误、旧帧保留和请求门控下一章将把前面知识组合起来实现实时轮询与历史数据回放。

相关新闻

3分钟学会用TCC-G15:Dell G15笔记本散热控制终极指南

3分钟学会用TCC-G15:Dell G15笔记本散热控制终极指南

3分钟学会用TCC-G15:Dell G15笔记本散热控制终极指南 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 还在为Dell G15笔记本的散热问题烦恼吗&#…

2026/11/7 7:20:42 阅读更多 →
OpenClaw会话失效问题解析与解决方案

OpenClaw会话失效问题解析与解决方案

1. OpenClaw会话失效问题深度解析 最近在开发者社区里,不少用户反馈OpenClaw存在一个奇怪的现象:前一天还正常的对话会话,第二天重启后就完全"失忆"了。表面上看这似乎是记忆系统的问题,但经过我两周的实测和源码分析&a…

2026/11/1 13:39:49 阅读更多 →
贪心算法实战:删数问题与单调栈优化详解

贪心算法实战:删数问题与单调栈优化详解

1. 问题引入:从键盘到算法的删数博弈 刚接触信息学奥赛的同学,大概率会在贪心算法的章节里遇到这道经典题目:“删数问题”。题目描述很简单:给你一个位数不超过250位的正整数 k ,和一个需要删除的数字个数 s &…

2026/10/31 12:51:27 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/6 15:21:35 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/6 9:29:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/6 22:01:11 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/6 22:01:11 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/6 8:08:42 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/6 22:01:09 阅读更多 →

日新闻

周新闻

月新闻