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/10/11 14:01:26 阅读更多 →
OpenClaw会话失效问题解析与解决方案

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

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

2026/10/11 5:54:14 阅读更多 →
贪心算法实战:删数问题与单调栈优化详解

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

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

2026/10/7 20:14:20 阅读更多 →

最新新闻

基于SpringBoot+Vue的健身房会员管理系统:从需求到部署实战

基于SpringBoot+Vue的健身房会员管理系统:从需求到部署实战

做健身房管理系统这个项目之前,我其实已经帮朋友的小型健身工作室手工处理过会员台账,用Excel记会员卡片信息、课程消耗、到期时间,说实话每天都在跟“这卡到底哪天到期”“这节私教课用了没有”这类问题搏斗。后来有一个某健身房老板找到我&…

2026/10/11 14:01:16 阅读更多 →
Docker容器化部署避坑指南:从镜像构建到生产落地的完整闭环

Docker容器化部署避坑指南:从镜像构建到生产落地的完整闭环

写Docker容器化部署这么久,我最大的感触是:能用Docker把容器跑起来的人很多,但能真正把它部署得稳、部署得省心的人很少。我见过太多项目,镜像体积动辄1GB起步,构建一次要等好几分钟,部署到生产环境后跑不起…

2026/10/11 14:01:16 阅读更多 →
多任务CVRP相似性知识迁移算法:原理、实现与工程要点

多任务CVRP相似性知识迁移算法:原理、实现与工程要点

这篇工作前后做了大半年,终于以SEVC的SCI 2区论文形式落地。核心研究内容是面向多任务容量约束车辆路径问题(CVRP)的相似性知识迁移算法,说白了就是在同时求解一大批CVRP实例时,让不同任务之间互相“偷师”&#xff1a…

2026/10/11 14:01:16 阅读更多 →
2026靶场更新解读:从单点漏洞到链路化渗透实战

2026靶场更新解读:从单点漏洞到链路化渗透实战

1. 这次“好靶场更新”,到底更新了什么 每年开春都是靶场集中改版的时间段,尤其3月份,很多维护者会把前一年积累的问题集中修复,顺便塞进一批新场景。2026年3月7日这波更新我盯了一上午,整体看下来不是简单加几个漏洞环…

2026/10/11 14:01:16 阅读更多 →
变电站红外图像中的PT/CT检测:889张标注数据与YOLOv8实战

变电站红外图像中的PT/CT检测:889张标注数据与YOLOv8实战

简介:这份数据集面向电力设备巡检与目标检测算法开发者,提供变电站红外场景下的电压电流互感器等设备标注样本,可直接用于训练YOLOv5/YOLOv8、Faster R-CNN等主流检测模型。包内共2000个文件,以VOC格式xml标注、YOLO格式txt标注和…

2026/10/11 14:01:15 阅读更多 →
银行排队系统仿真实验:基于SimPy的M/M/c离散事件建模与参数分析

银行排队系统仿真实验:基于SimPy的M/M/c离散事件建模与参数分析

简介:银行排队系统实验报告是一份面向数据结构课程学习者的C语言实践项目,通过模拟多窗口银行客户到达、排队与离开过程,帮助掌握队列结构、随机事件生成和平均逗留时间计算等核心知识点。资源包内共1个doc文档,大小191KB&#xf…

2026/10/11 14:00:15 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →