2017-03-07 1 views
0

In Angularjs muss ich eine Liste von Datenpunkten {Name: "", Typ: "", Wert: "", ...}, die ich aus der Datenbank der Cumulocity abrufen Wolke. Außerdem müssen die Datenpunkte aktualisiert werden, wenn sich ihr Wert im Backend ändert. Der Name und der Typ des Datenpunkts sind im Voraus bekannt, aber der Wert muss separat abgerufen und aktualisiert werden, nachdem er im Backend geändert wurde.Handle Updates auf ein Array von versprochenen Objekten

function init(){ 
    var promiseDatapointNameType = c8yDevices.detail(deviceId); 
    promiseDatapointNameType.then(c8yBase.getResData) 
    .then(createDatapointObjectStack) 
    .then(getDatapointObjectValues) // Problems start here 
    .then(resolvedObjectsToView); 
}; 

Ich versuche, dies durch eine Reihe von versprochenen Zielen zu erreichen, wobei jedes Objekt den des Datenpunktes ist {Name und Art}, die zuvor abgerufen wurden und dann fordere ich den letzten Wert für jeden der Datenpunkt-Objekte in dem Stack aus dem Backend.

function getDatapointObjectValues(datapointStack){ 
    return datapointStack.map(function(dpObject){ 
    return getLatestMeasurement(dpObject); 
    }); 
} 

Deshalb rufe ich die Funktion getLatestMeasurement auf jedes Objekt in der datapointStack, dass eine Anfrage an die Datenbank Cumulocity feuert und gibt ein Versprechen, das die neueste Wert für den Datenpunkt-Objekt zurückgibt, wenn gelöst. Zusätzlich wird die Echtzeitoption gesetzt, die diesen zugesagten Wert in "Echtzeit" bei Wertänderung aktualisiert.

// 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; 
    }); 
}; 

Wenn eine der Versprechungen in der Anordnung der versprochenen Objekte aufgelöst wird, möchte ich das entsprechende Datapoint-Objekt in der Ansicht aktualisieren, so dass der neue Wert angezeigt wird.

function resolvedObjectsToView(dpStackValues){ 
    $q.race(dpStackValues).then(function(dpRaceObject){ 
    vm.device.datapointStack.push(dpRaceObject); 
    }); 
} 

Mein aktueller Zustand ist, dass alle Datenpunkte angezeigt zu bekommen, aber aktualisieren sie ihre Werte nicht, wenn sie im Backend ändern. Hier bin ich festgefahren, weil ich nicht weiß, ob die Wiederverwendung eines Versprechens, nachdem es in einem Array gelöst wurde, praktikabel ist und auch, wie man es mit einem alternativen Weg erreichen kann. Wenn ich race benutze wird nur ein einzelner Datenpunkt in der Liste angezeigt, wenn ich $ q.all benutze werden alle angezeigt aber in beiden Fällen wird kein Wert aktualisiert.

Also meine Fragen sind:

Wie Wiederverwendung i versprochen Objekte, wenn ein Wert in den Backend-Änderungen behoben? Und wie aktualisiere ich einen Objektwert in der Ansicht, wenn das zugehörige versprochene Objekt in einem Array verrechnet wird?

+0

'wenn Sie ein Versprechen wiederverwenden, nachdem es in einem Array aufgelöst wurde, praktikabel '- was meinen Sie Wiederverwendung? Sobald ein Versprechen gelöst ist, ist es –

+0

_ "Gibt eine Zusage zurück, die zu einem Objekt mit den neuesten Messdaten für den angegebenen Filter aufgelöst wird. Optional wird dieses Objekt in Echtzeit aktualisiert." _ Die Beschreibung für die c8yMeasurements.latest-Methode aus der API. Wenn das Versprechen nur einmal gelöst wird, wie ist es dann möglich, Wertupdates ohne häufige Anfragen zu erhalten? – frmfl

+0

Web Aocket. Server hat Ereignisse gesendet. Lange Umfragen. Das sind 3 Möglichkeiten, wie ich an –

Antwort

0

Warum verwenden Sie nicht die Cumulocity-Echtzeit-Benachrichtigung für diesen Zweck? Sie können leicht feststellen, wann sich jede Art von Messung zum genau richtigen Zeitpunkt ändert. Sie müssen also einen Kanal in Cumulocity erstellen, in dem Sie alle Messungen empfangen und diese Messung an einen Benachrichtigungskanal senden, den Sie möchten. Hier ist, wie ich es sehe: 1. Die Programm-Meldung für jede Messung

insert into 
     SendNotification 
    select 
     m.measurement as payload, 
     "measurement/myspecificchannelname" 
    from 
     MeasurementCreated m; 
  1. Erstellen Sie ein Abonnement in der App auf den Kanal, den Sie erstellt haben, wie:

. Beachten Sie, dass Sie in diesem Beispiel eine Subskription für den Kanal measurement/myspecificchannelname erstellen müssen.

wie so:

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

Wenn Sie eine bestimmte Messung haben dies der beste Weg sein. Aber wenn Sie irgendeine Messung von irgendeinem Gerät wollen, was etwas seltsam ist, können Sie einfach ein Abonnement für einen/Messkanal machen, der bereits in Cumulocity erstellt wurde.

Das ist nur ein Weg und hoffe, dass dir das irgendwie hilft! Vielleicht, wenn ein Typ von cumulocity hier auftaucht, wird es besser!

Verwandte Themen