NEWS
SetState(), wann genau wird das Objekt angelegt?
-
Guten Morgen,
ich möchte meine Ereignisliste persistent gestalten.
Dazu speichere ich das Array mit den Ereignissen in ein ioBroker Objekt mit setState(). Im selben Script wird das Objekt dann gelesen, damit beim Neustart die Ereignisliste nicht wieder bei null anfängt.
Also:
-
setState() Objekt anlegen (wird ja nur ausgeführt, wenn es das Objekt noch nicht gibt)
-
getState() Objekt wieder einlesen (beim ersten Start, das angelegte Objekt, sonst die vorhandenen Daten)
Das klappt auch prima, nur nicht beim Erststart mit noch nicht vorhandenen Objekt.
Dann erhalte ich eine Warnung, dass es das Objekt noch nicht gibt und eine Fehlermeldung bei der Verarbeitung des Inhalts.
Beim zweiten Start (und allen weiteren Starts) des Scripts funktioniert es prima.
Erzeugt beim ersten Start des Scripts einen Fehler:
createState('ereignisListe.events',"Ereignisliste angelegt"); // Die Ereignisliste als Array // ... var ereignisliste = getState('ereignisListe.events').val;
-
-
setState() Objekt anlegen (wird ja nur ausgeführt, wenn es das Objekt noch nicht gibt) `
Wirklich ?Meiner Meinung nach wird das Objekt (der virtuelle Datenpunkt) nur mit createState() angelegt. setState() aktualisiert den Inhalt von object.newState.
Anmerkung: Die Bezeichnung createState() erscheint etwas verwirrend, da ein Objekt erzeugt wird, für das in der Automatisierungstechnik der Begriff (virtueller) Datenpunkt gebräuchlich ist. Außerdem würde ich es begrüßen, wenn man virtuelle Datenpunkte unter dem Reiter "Objekte" mit Hilfe einer Eingabemaske, die alle zulässigen Objektparameter (natürlich nicht die dynamischen Parameter .newState und .oldState) enthält, erzeugen könnte.
-
createState('ereignisListe.events',"Ereignisliste angelegt");
Ist asynchron.
In deinem Fall versuchst du getState aufzurufen für einen State, was noch nicht existiert.
Richtig währe so:
createState('ereignisListe.events',"Ereignisliste angelegt", function () { var ereignisliste = getState('ereignisListe.events').val; });
Oder so:
createState('ereignisListe.events',"Ereignisliste angelegt"); function main() { var ereignisliste = getState('ereignisListe.events').val; //... } // warte bis alle States und Objekte angelegt werden. setTimeout(main, 500);
-
Erst einmal Danke für die Rückmeldung! und Lösung!
Wirklich ?
Meiner Meinung nach wird das Objekt (der virtuelle Datenpunkt) nur mit createState() angelegt. setState() aktualisiert den Inhalt von object.newState. `
Ne, nicht wirklichsetState() war nur ein Tippfehler. ich meinte createState(), wie im Codeauszug aufgeführt.
createState('ereignisListe.events',"Ereignisliste angelegt");
Ist asynchron.
In deinem Fall versuchst du getState aufzurufen für einen State, was noch nicht existiert. `
asynchrone bedeutet, dass während das Objekt angelegt wird, das Script weiter abgearbeitet wird?Ich hatte das schon vermutet und deshalb eine Pause von 1 Sekunde eingebaut (dachte ich, hatte ich wohl falsch gemacht).
Richtig währe so:
createState('ereignisListe.events',"Ereignisliste angelegt", function () { var ereignisliste = getState('ereignisListe.events').val; }); ```` `
Das hat nicht funktioniert.
Im weiterem Verlauf erhalte ich dann den Fehler, das es ereignisliste nicht gibt.
Kann es sein, dass die Variable nur in der Funktion existiert und deswegen später als nicht deklariert moniert wird?
Oder so:
createState('ereignisListe.events',"Ereignisliste angelegt"); function main() { var ereignisliste = getState('ereignisListe.events').val; //... } // warte bis alle States und Objekte angelegt werden. setTimeout(main, 500); ```` `
Das hat funktioniert.
Ich hatte mir eine pause() Funktion gebaut, die anscheinend nicht funktioniert. Wieder asynchron?
function pause(sek) { if (!sek) sek = 1000; var startTime = new Date().getTime(); while ((new Date().getTime() - startTime < sek)) { } }
und dann wie folgt aufgerufen:
pause(); var ereignisliste = getState('ereignisListe.events').val;
-
` > ````
createState('ereignisListe.events',"Ereignisliste angelegt", function () {
var ereignisliste = getState('ereignisListe.events').val;
});
````Das hat nicht funktioniert. `
Es versteht sich natürlich dass Code dann so aussiehtcreateState('ereignisListe.events',"Ereignisliste angelegt", function () { var ereignisliste = getState('ereignisListe.events').val; // Weitere operationen, z.b. log(ereignisliste); });
und nicht so:
createState('ereignisListe.events',"Ereignisliste angelegt", function () { var ereignisliste = getState('ereignisListe.events').val; }); // Weitere operationen, z.b. log(ereignisliste);
Die Variable "ereignisliste" existiert nur in der Funktion.
` > Ich hatte mir eine pause() Funktion gebaut, die anscheinend nicht funktioniert. Wieder asynchron?
function pause(sek) { if (!sek) sek = 1000; var startTime = new Date().getTime(); while ((new Date().getTime() - startTime < sek)) { } } ```` `
natürlich. Das ist extrem falsch. Das ist kein "C".
Man muss immer sich dran erinnern, dass JS ist "quasi"single-threaded. D.h. so lange dein Kode hier wartet, kein weiteres wird dann ausgeführt. Ja du kannst so 1 Sekunde warten, aber createState ist nicht mal ausgeführt, weil du keine Zeit gegeben hast. Du hast sehr wichtige Sachen zu tun: warten und das wird auch gemacht, so dass keine andere Funktion ausgeführt wird.
-
Hi Bluefox,
also danke, danke, danke, dass Du Dir immer wieder die Zeit nimmst.
Das hat mich jetzt wirklich eine ganze Ecke vom Verständnis weitergebracht.
Obwohl… asynchron und "single-threaded" ist für mich so ein kleines Paradoxon.
Und über den Unterschied zu der Pause Funktion (da habe ich verstanden, warum das Blödsinn ist) und setTimeout muss ich auch noch einmal grübeln.
Gruß
Michael