Cumulocity实时获取最新测量值问题:realtime参数未生效
解决Cumulocity JS SDK实时测量值更新不生效的问题
我来帮你梳理下问题所在和解决办法:
首先,你当前的代码用了then()来处理结果,但这是Promise的语法——Promise只会在第一次获取到数据时执行一次回调,而当realtime=true时,c8yMeasurements.latest()返回的其实是一个可订阅的Observable对象,它会持续监听设备的新测量值,每次有数据更新时都会推送新值。这就是你看不到vm.text更新的核心原因:单次的then()无法捕获后续的实时推送数据。
先搞懂realtime=true的工作机制
当你把realtime设为true时,SDK会和Cumulocity平台建立一个WebSocket长连接,订阅你指定设备的测量值更新事件。一旦平台收到该设备的新测量数据,就会通过这个WebSocket连接主动推送给你的客户端,而不是让你反复轮询。但这种持续推送的模式需要用**订阅(subscribe)**的方式来接收数据,而不是Promise的一次性回调。
修正后的代码示例
把then()换成subscribe(),这样每次有新测量值时,回调都会被触发,更新vm.text:
c8yMeasurements.latest(filter, true) .subscribe(function(latestMeasurement) { vm.text = latestMeasurement.c8y_TemperatureMeasurement.T.value; console.log(vm.text); });
额外提醒:记得清理订阅
如果你的代码是在前端组件中运行的(比如Angular、Vue组件),一定要在组件销毁时取消订阅,避免WebSocket连接泄漏导致内存问题:
// 保存订阅对象的引用 const measurementSubscription = c8yMeasurements.latest(filter, true) .subscribe(function(latestMeasurement) { vm.text = latestMeasurement.c8y_TemperatureMeasurement.T.value; console.log(vm.text); }); // 比如在Vue的beforeUnmount或者Angular的ngOnDestroy中执行取消订阅 function onComponentDestroy() { measurementSubscription.unsubscribe(); }
这样修改后,当设备有新的温度测量值上传时,vm.text就会自动更新啦。
内容的提问来源于stack exchange,提问作者Katherine Chen
相关产品推荐
相关产品推荐

