2017-03-07 81 views
0

在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,它們都會顯示,但在這兩種情況下都沒有值更新。

所以我的問題是:

我如何重複使用,如果解決了承諾的對象在後端的值改變? 如果數組中相關的承諾對象解析,我該如何更新視圖中的對象值?

+0

'如果在數組中解析後重復使用承諾是可行的' - 您是什麼意思重用?一旦承諾得到解決,就是這樣 –

+0

_「返回一個承諾,該承諾解析爲具有指定過濾器的最新測量數據的對象,或者實時更新該對象。」_ 對於c8yMeasurements.latest方法API。 如果承諾只解決一次,那麼如何在沒有頻繁請求的情況下接收價值更新? – frmfl

+0

Web aocket。服務器發送事件。長期投票。這是我能想到的3種方法 –

回答

0

爲什麼不爲此目的使用cumulocity實時通知?當任何類型的測量在恰當的時候改變時,您都可以輕鬆獲得。因此,您需要在cumulocity中創建一個可接收所有測量值的通道,並將這些測量值發送到您想要的通知通道。這是我看到它: 1.每次測量信道通知

insert into 
     SendNotification 
    select 
     m.measurement as payload, 
     "measurement/myspecificchannelname" 
    from 
     MeasurementCreated m; 
  • 創建您的應用程序訂閱您所創建的頻道,如:
  • Cumulocity angular notification module documentation 。請注意,在此示例中,您必須創建對measurement/myspecificchannelname通道的訂閱。

    像這樣:

    var channel = '/measurement/myspecificchannelname'; 
    function init() { 
    c8yNotifications.subscribe(channel).then(onSubscription); 
    } 
    

    如果你有一個特定的測量,這將是最好的方式。但是,如果你想從任何設備進行任何測量,這將是奇怪的,你可以訂購一個已經在累積中創建的/測量通道。

    這只是一種方式,並希望這可以幫助你以某種方式!也許如果一些來自cumulocity的人出現在這裏會更好!