当前位置: 首页 > news >正文

记一次大屏某一处图像采集接口异常导致该页其他图表都无法显示问题解决

问题描述:

开发的大屏有一处实时感知数据区域,用于显示采集到的机器人的实时里程计相关传感器数据,以及机器人摄像头的实时图片帧。在没有对接这个接口时,该页大屏其他图表显示正常;在正常测试对接该接口时,各区域也都能实时显示数据。

因为机器人也无法实时一直开着,所以后续后端对接处理的服务就关闭了,也就没在关注。后面偶然一次关注该页大屏时,发现其他也图表都没有显示,且该页页面卡顿。

 

问题原因:

因为图片帧对接的后端接口无法建立连接(后面核实是机器人只在测试调试时才开启了后端该接口服务,其他时候该接口服务功能(如端口)是关闭的),导致前端大屏无法发送请求,连接被拒绝,然而,js如下代码片段:

image

image

 

 1 if (usResult.code === 200 && usResult.success === true && !!usResult.data) {
 2     var requestParam = buildImageBindPayload(usResult);
 3     var urlarray = [];//存储websocket地址
 4     var channelResult;
 5     //通知构建采集通道
 6     $.ajax({
 7       type: 'POST',
 8       url: realtimedataurl + '/api/rosNodeManager/bindRos',
 9       data: JSON.stringify(requestParam),
10       contentType: 'application/json',
11       async: false,
12       success: function (res) {
13         channelResult = res;
14       },
15       error: function (xhr, status, error) {
16         console.log('Error:', error);
17         showConnectionStatus('通道地址API请求失败', 'error');
18       }
19     });
20 if (channelResult.code === 200 && channelResult.success === true && !!channelResult.data) {
21       channelResult.data.forEach((item, index) => {
22         urlarray[index] = item.websocketUrl
23       });
24       uswebsocketmode4Third(urlarray); //视频显示方法
25     } else {
26       showConnectionStatus('获取视频websocket地址失败,请检查数据采集反馈接口内容', 'error');
27     }
28 
29   }

 

因为后端服务连接无法访问,所以请求直接进入error分支,并且channelResult也是null并没有任何后端接口返回的值,然后再执行图中:

if (channelResult.code === 200 && channelResult.success === true && !!channelResult.data)时就异常报错了,因为js无法获取channelResult.code信息(channelResult非正常情况赋值,里面没有code结构),才导致页面捕获到该异常卡在该区域图表函数,而该页其他图表的函数调用顺序是在当前图片帧图表的下方(之后),导致其他图表函数就没有被调用。

 

解决办法:

 方法1:

追加一个isError变量,初始值置为false;代表没有异常,一旦请求接口进入error分支(比如连接被拒绝,未开启接口服务等),就将isError置为true;

然后在请求接口代码段下方做判断,isError为true,直接结束。

修订后代码如下:

image

image

 

 1 //-2(2)构建请求参数,并通知数据采集方采集并构建通道,接收返回的通道地址
 2   var isError = false;
 3   if (usResult.code === 200 && usResult.success === true && !!usResult.data) {
 4     var requestParam = buildImageBindPayload(usResult);
 5     //console.log('请求参数临时记忆:',JSON.stringify(requestParam));
 6     var urlarray = [];//存储websocket地址
 7     var channelResult;
 8     //通知构建采集通道
 9     $.ajax({
10       type: 'POST',
11       url: realtimedataurl + '/api/rosNodeManager/bindRos',
12       data: JSON.stringify(requestParam),
13       contentType: 'application/json',
14       async: false,
15       success: function (res) {
16         channelResult = res;
17       },
18       error: function (xhr, status, error) {
19         console.log('Error:', error);
20         isError = true;
21         showConnectionStatus('通道地址API请求失败', 'error');
22       }
23     });
24 
25     if(isError === true) return;
26 
27     if (channelResult.code === 200 && channelResult.success === true && !!channelResult.data) {
28       channelResult.data.forEach((item, index) => {
29         urlarray[index] = item.websocketUrl
30       });
31       uswebsocketmode4Third(urlarray); //视频显示方法
32     } else {
33       showConnectionStatus('获取视频websocket地址失败,请检查数据采集反馈接口内容', 'error');
34     }
35 
36   }

方法2:

最简单,不关心函数内部的异常,直接在调用最顶级函数的地方,包一下try-catch即可。

如:

try { USDisplay4Third(); } catch (e) { }
 1 // 在全局作用域定义定时器变量
 2 let paramsDisplayTimer = null;
 3 export function ThirdTab() {
 4   //
 5   $(function () {
 6     
 7     // 清除已存在的定时器
 8     if (paramsDisplayTimer !== null) {
 9       clearInterval(paramsDisplayTimer);
10       paramsDisplayTimer = null;
11     }
12     // 立即执行一次,保证第一次能立即执行
13     paramsDisplay();
14     //try { paramsDisplay(); } catch (e) { }
15 
16     // 设置新的定时器
17     paramsDisplayTimer = setInterval(function () {
18       paramsDisplay();
19       //try { paramsDisplay(); } catch (e) { }
20     }, 1000);
21 
22 
23     try { USDisplay4Third(); } catch (e) { }
24 
25 
26     //第三页无人系统介绍
27     //unmanned_system_introduce();
28     try { unmanned_system_introduce(); } catch (e) { }
29 
30     //第三页地图
31     //unmanned_system_map_openlayers();
32     try { unmanned_system_map_openlayers(); } catch (e) { }
33 
34   })
35 
36 }

 

http://www.rkmt.cn/news/110694.html

相关文章:

  • LobeChat能否支持梦境解析?睡眠记录与心理象征意义探讨
  • Linly-Talker开源教程:打造会说话的AI虚拟人
  • Flutter:在流动的 UI 中,重新理解“界面”的意义
  • vue基于Spring Boot的高校教师考勤科研培训管理系统设计与实现
  • 关于Windows 11 家庭中文版 25H2中ensp无法启动路由器,报40错的解决方法
  • vue基于Springboot框架大学生竞赛辅导管理系统设计与实现_979lg660
  • 基于Dify部署多语言GPT-SoVITS合成系统的架构设计
  • 开源不输商用!LobeChat媲美ChatGPT的用户体验实测
  • PC板生产厂家推荐榜:29年经验 + 70多品种全覆盖(厂家直销) - 品牌排行榜
  • vue基于Springboot框架的宠物之家领养寄养救助商城管理系统h1ypq0zm
  • 12月12号
  • vue基于Springboot框架大学生家教平台_85m5z064 没论文
  • AI元人文构想:人机协作的“未来哪吒”架构
  • LobeChat能否取代官方ChatGPT客户端?对比评测来了
  • 机柜空调哪家好:上海5家实力厂商深度对比(附选型参数) - 品牌排行榜
  • vue基于spring boot的学生宿舍分配报修管理系统
  • 流量监控前端不显示问题
  • 利用Proxifier、Burp Suite和亮数据高效抓包
  • C语言:枚举体
  • 【LLM基础教程】语言模型基础
  • YOLO-v5论文的10个核心创新点解析
  • 【LLM基础教程】统计语言模型N-gram
  • Nigx配置
  • gpt-oss-20b RESTful API设计与集成指南
  • 【玩转全栈】----Django根本设置和介绍
  • GPT-SoVITS音色相似度优化技巧:提升克隆真实感
  • 2025/12/16英语打卡
  • Windows下Python安装失败?换用清华源重试TensorFlow安装
  • Qwen3-32B大模型调用与鉴权指南
  • 2025年十大隐形车衣优质厂家排行榜,隐形车衣厂家测评指南 - myqiye