在 Angularjs 中,我需要显示从 Cumulocity 云的数据库中检索到的数据点列表 {name:"", type:"", value:"",...}。此外,每当后端的值发生变化时,我都需要更新数据点。数据点名称和类型是事先知道的,但是我必须单独检索并在后端更改后更新该值。
function init(){
var promiseDatapointNameType = c8yDevices.detail(deviceId);
promiseDatapointNameType.then(c8yBase.getResData)
.then(createDatapointObjectStack)
.then(getDatapointObjectValues) // Problems start here
.then(resolvedObjectsToView);
};
我试图通过一组承诺的对象来实现这一点,其中每个对象都是之前检索到的数据点的{name and type},然后我从后端请求堆栈中每个数据点对象的最新值。
function getDatapointObjectValues(datapointStack){
return datapointStack.map(function(dpObject){
return getLatestMeasurement(dpObject);
});
}
因此,我对 datapointStack 中的每个对象调用函数getLatestMeasurement ,该函数向 Cumulocity 数据库发出请求并返回一个 promise,该 promise 在解析时返回数据点对象的最新值。此外,还设置了实时选项,它在值更改时“实时”更新这个承诺值。
// For a given filter, function returns a promise of the latest
function getLatestMeasurement(dpObject){
var filter = {
device: deviceId,
fragment: "CloudControl Parameters",
series: dpObject.name
};
var realtime = true;
return c8yMeasurements.latest(filter, realtime).then(c8yBase.getResData).then(function (responseValue) {
var jsonPathToDp = filter.fragment + "." + filter.series + ".value";
var latestValueDB = getObjectValue(responseValue, jsonPathToDp);
dpObject.valueLatest = latestValueDB;
return dpObject;
});
};
如果承诺对象数组中的任何承诺得到解决,我想更新视图中相应的数据点对象,以便显示新值。
function resolvedObjectsToView(dpStackValues){
$q.race(dpStackValues).then(function(dpRaceObject){
vm.device.datapointStack.push(dpRaceObject);
});
}
我目前的状态是显示所有数据点,但是如果它们在后端发生变化,它们不会更新它们的值。在这里我被卡住了,因为我不知道在数组中解决后重用承诺是否可行,以及如何用另一种方式完成它。如果我使用比赛,列表中只显示一个数据点,如果我使用 $q.all,它们都会显示,但在这两种情况下都没有值更新。
所以我的问题是:
如果后端中的值发生变化,我如何重用已解决的承诺对象?如果数组中关联的承诺对象解析,我如何更新视图中的对象值?