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?
'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 –
_ "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
Web Aocket. Server hat Ereignisse gesendet. Lange Umfragen. Das sind 3 Möglichkeiten, wie ich an –