当前位置: 首页 > 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.jsqmd.com/news/99987/

相关文章:

  • LobeChat能否支持梦境解析?睡眠记录与心理象征意义探讨
  • LobeChat支持拖拽上传文件吗?实测多种格式兼容性
  • 三大在线少儿编程机构深度对比与选择指南 - 品牌测评鉴赏家
  • LobeChat能否接入语音合成TTS?全流程语音交互实现
  • 2025年信誉好的工业设计企业排行榜,新测评精选工业设计机构 - 工业推荐榜
  • vue基于Springboot框架大学生竞赛辅导管理系统设计与实现_979lg660
  • 基于Dify部署多语言GPT-SoVITS合成系统的架构设计
  • 2025年薄壁轴承加工厂推荐:哪家更值得选、维护更方便、工艺 - mypinpai
  • 关于Windows 11 家庭中文版 25H2中ensp无法启动路由器,报40错的解决方法
  • Flutter:在代码与像素之间,重建移动开发的诗意
  • 解决‘此扩展程序不再受支持,因此已停用’问题:PaddlePaddle浏览器插件适配建议
  • 开源不输商用!LobeChat媲美ChatGPT的用户体验实测
  • TensorFlow-GPU环境搭建与PyCharm配置指南
  • 2025年湖北岩棉净化板供应商排名:硅岩净化板与机制净化板安 - myqiye
  • 网安零基础必冲!upload-labs 文件上传漏洞保姆级通关教程
  • 2025年高性价比少儿编程机构推荐,这几家非知名品牌值得关注 - 品牌测评鉴赏家
  • 2025岩棉净化板定制TOP5权威推荐:玻镁硫氧镁净化板厂家 - 工业品牌热点
  • 唐诗容斥解CF2170E
  • FLUX.1-ControlNet自定义控制模式全解
  • PC板生产厂家推荐榜:29年经验 + 70多品种全覆盖(厂家直销) - 品牌排行榜
  • vue基于Springboot框架的宠物之家领养寄养救助商城管理系统h1ypq0zm
  • 使用ContextMenuManager优化右键菜单,快速启动TensorFlow终端(Windows+清华源)
  • 12月12号
  • AutoGPT使用指南:从安装到自主代理实战
  • 2025年法兰轴承生产厂推荐:法兰轴承生产厂哪家专业? - myqiye
  • 算法备案自评估报告秘籍:坑点全走开!
  • PaddlePaddle工业级模型库实践:通过git下载实现快速落地
  • Langchain-Chatchat PostgreSQL集成配置步骤
  • AI元人文构想:人机协作的“未来哪吒”架构
  • LobeChat能否取代官方ChatGPT客户端?对比评测来了