NEWS
obj.common.name undefiniert - durch Timingproblem?
-
Habe hier ein Blockly, das mir "Reminder" überwachen, bzw. deren neue Erstellung abfangen und auf den "Betreff" reagieren soll.
Sieht so aus:
Der erzeugte Code: on({id: new RegExp("(alexa2.0.Echo-Devices.*.Reminder.*.time)"), change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if ((obj.common ? obj.common.name : "").indexOf('Starte Aufnahme') + 1 == 1) { } });
Nun kommt es ab und an vor, dass das Skript abschmiert.
Der Grund wohl, dass "Name" zum Zeitpunkt der Prüfung undefiniert ist.
Im Log steht dann:Error in callback: TypeError: Cannot read property 'indexOf' of undefined
Nun Frage ich mich, (wie) kann das sein?
Ich vermute ein Timing Problem.
Aber ist es überhaupt möglich, dass "Name" (noch) nicht definiert ist, wenn doch die Einträge für ".enabled", ".time" und ".triggered" alle schon da sind?
Frage an den Alexa2 Meister @apollon77, wird erst ganz am Ende die Struktur "benannt"?
Im Webinterface kann ich dazu leider keine Schlüsse ziehen, da das viel zu träge dafür ist.
Sollte ein Timeout von 500ms vor dem "Falls" das Skript sicher machen? -
@padrino sagte:
Error in callback: TypeError: Cannot read property 'indexOf' of undefined
Die Fehlermeldung kann man verhindern.
-
@paul53
Guter Tipp, danke.
Aber dann wird ja nicht nur der Fehler unterdrückt, sondern auch das Skript evtl. gar nicht ausgeführt - obwohl "name" noch true sein wird.
Vielleicht sollte ich es so machen
-
@padrino sagte:
Vielleicht sollte ich es so machen
Ich kann mir nicht vorstellen, dass common.name gesetzt wird, nachdem der Zustand des Datenpunktes geändert wurde. Wenn es aber wirklich ein Timing-Problem sein sollte, dann sollte timeout genügen.
-
Mir ist auch neu das bei einem State-Change Subscribe Objektdaten enthalten sind! Du musst eher getObject mit der ID des getriggerten Statechanges machen um an den Name zu kommen
-
@apollon77 sagte:
Mir ist auch neu das bei einem State-Change Subscribe Objektdaten enthalten sind!
Wirklich ?
-
Ok, habt recht ... das gibts wirklich ... wieder was gelernt, aber da Objekte getrennt von States gepublished werden kann es zu solchen Timing-Dingen kommen.
Vor allem bei neuen Objekten wird der initiale State als Default wert gesetzt. An sich code tech isch läuft das nach dem Anlegen des Objekts, aber state und objects sind zwei getrennte Netzwerk-Verbindungen über die die Daten zu neuen Daten reinkommen. Damit ist die Reihenfolge wieder offen.
Ich würde ja ein delay von 500ms einbauen und dann getbject nehmen für die Objektdaten. Ist immer nch nicht 100% aber besser
-
@apollon77
Also, eigentlich klappt das hier so.
War auch erstaunt, als auf einmal der Fehler auftrat, weil es ja sonst rund lief...Dann pack' ich wohl ein timeout rein. Ich hab'/kann ja nur Blockly, damit kommt man leider nicht an jedes Detail ran...
-
@padrino Ist halt ein Timing Thema ,... 99% vs 1% und so