NEWS
Zeit für ein setState? [gelöst]
-
Hi Zusammen,
ich habe mal eine Verständnisfrage. Wenn ich einen Datenpunkt auslese, diesen abändere und danach nochmals auslese, müsste ich ja einen anderen Wert bekommen, oder?Wieso erscheint bei diesem Mini-Skript denn immer derselbe Wert?
Der Datenpunkt ist vom Typ "number"var dp = "javascript.0.Test.Test"; var value = getState(dp).val; log(value); setState(dp,parseFloat(getState(dp).val) + 10,true); var newvalue = getState(dp).val; log(newvalue);
-
@SKB sagte:
setState(dp,parseFloat(getState(dp).val) + 10,true);
var newvalue = getState(dp).val;Das funktioniert deshalb nicht, weil setState() asynchron ausgeführt wird. Bei Einlesen des gleichen Datenpunktes ist setState() noch nicht fertig, man erhält also den alten Wert.
-
@paul53
Danke für die Ausführung. Das hatte ich fast vermutet. Kann man eine Kontrolle erstellen, in der man dann prüft, wann setState fertig ist bzw. den aktuellen Wert liefern kann? -
@SKB sagte:
Kann man eine Kontrolle erstellen, in der man dann prüft, wann setState fertig ist bzw. den aktuellen Wert liefern kann?
Wozu soll das gut sein ? Innerhalb eines Scripts kann man Scriptvariablen verwenden.
EDIT: Man kann setState() auch eine Callback-Funktion mitgeben, die ausgeführt wird, wenn setState() fertig ist.
setState(dp,parseFloat(getState(dp).val) + 10,true, function() { var newvalue = getState(dp).val; log(newvalue); });
-
@paul53
Das wäre z.B. sinnvoll, wenn man mehrere setState's ausführt und dann eine Addition der neuen Werte vollziehen möchte.
Klar, das geht auch in einem Skript - aber es könnten ja auch andere Skripte den Datenpunkt lesen wollen und dann z.B. mit einem on-listening auf dem Datenpunkt neue Werte irgendwo hin schreiben. -
@SKB sagte:
andere Skripte den Datenpunkt lesen wollen
Dort triggert man auf den Datenpunkt und bekommt so die Änderung mit.
@SKB sagte in Zeit für ein setState?:
wenn man mehrere setState's ausführt und dann eine Addition der neuen Werte vollziehen möchte.
Addition von Scriptvariablen, die die neuen Werte enthalten.
-
@paul53
Richtig. Aber sagen wir mal, man hört auf einem Datenpunkt mit on und erwartet, dass auch die anderen Datenpunkte die neuen Werte enthalten, die soeben geschrieben (hätten) werden sollen. Dann kann es ja passieren, das man eben nicht alle aktellen Werte bekommt, da asynchron geschrieben wird. -
@SKB sagte:
Dann kann es ja passieren, das man eben nicht alle aktellen Werte bekommt, da asynchron geschrieben wird.
Der Fall ist mir noch nicht untergekommen. Notfalls verzögert man die Abfrage der anderen Datenpunkte etwas (50 ms).
-
@paul53
Das wäre jetzt auch meine einzige Idee. Danke für die Ausführung! -
@SKB
Habe meine Antwort oben noch um die Callback-Funktion von setState() ergänzt.