在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);
};
我試圖通過承諾對象的數組,每個對象是數據點的{名稱和類型}這是較早的檢索,然後我要求的最新值中的每個數據點的對象來完成這個從後端堆棧。
function getDatapointObjectValues(datapointStack){
return datapointStack.map(function(dpObject){
return getLatestMeasurement(dpObject);
});
}
因此,我調用該函數getLatestMeasurement在datapointStack每個對象,將觸發到Cumulocity數據庫的請求,並返回解析時的數據點對象返回的最新值承諾上。另外,實時選項被設置,在值更改時「實時」更新這個承諾值。
// 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,它們都會顯示,但在這兩種情況下都沒有值更新。
所以我的問題是:
我如何重複使用,如果解決了承諾的對象在後端的值改變? 如果數組中相關的承諾對象解析,我該如何更新視圖中的對象值?
'如果在數組中解析後重復使用承諾是可行的' - 您是什麼意思重用?一旦承諾得到解決,就是這樣 –
_「返回一個承諾,該承諾解析爲具有指定過濾器的最新測量數據的對象,或者實時更新該對象。」_ 對於c8yMeasurements.latest方法API。 如果承諾只解決一次,那麼如何在沒有頻繁請求的情況下接收價值更新? – frmfl
Web aocket。服務器發送事件。長期投票。這是我能想到的3種方法 –