Edit: Der Beitrag entstand schon, da habe ich den neuen Code noch nicht gesehen. "handleButtonClick" ist auf jeden Fall verständlicher als "state"., wobei ich mit euren Erklärungen das (hoffentlich) dann verstanden habe. Danke für die Mühe, dass du den Code extra umgeschrieben hast.
Start des originalen Beitrags:
Danke für die weiteren Erklärungen.
Jetzt verstehe ich etwas mehr und habe entdeckt, am "Ende" der Klasse wird "restart" aufgerufen und da wird "setDelayState" an "state" gebunden und "state" wird dann mit dem Klick auf den Button aufgerufen.
"clearTimeout" bricht den eingestellten Timer ab und mit
"setTimeout" kann ich einen neuen Timer definieren. Mit denen Infos habe ich mir die Änderung eigentlich recht einfach vorgestellt.
Wenn ich meinen Button anklicke, dann wird "setDelayState" aufgerufen und dann will ich erst mal den Timer abbrechen, dann meine LED's anders setzen und danach setze ich wieder einen Timer von 3 Sekunden. Bevor ich das in eine Funktion auslagere, habe ich einfach mal das was ich hier in Worte gefasst habe, so in "setDelayState" geschrieben und enttäuschend musste ich feststellen, dass das nichts änderte. Bzw. an dem Status-Text den ich eingefügt habe, sehe ich, dass der Timer der in "restart" gesetzt wurde nicht gelöscht wird. Denn nach einem Klick auf den Button erscheint erst "Warte auf Tastendruck" und dann 3 Sekunden später "Mein neuer Timer ist abgelaufen".
"this" habe ich so wie "self" in Python verstanden und dachte dass ich damit den Timer in der Klasse auch abbrechen kann.
Eigentlich kopiere ich ja nur einen Teil aus "reset" weil da genau das gemacht wird was ich brauche. Und deswegen sicherlich auch gleich der Lösungsweg, dass man eine Funktion schreibt, die in "restart" dann auch aufgerufen werden kann.
Code: Alles auswählen
setDelayState() {
clearTimeout(this.timeoutID);
this.delayIndex = (this.delayIndex + 1) % this.delayValues.length;
setTimeout(
() => {
this.timeoutID = null;
this.state = this.deviceIsOffState;
this.statusText = "Mein neuer Timer ist abgelaufen"
},
SET_DELAY_DURATION * 1000
);
}
Falls das hier jetzt was offensichtliches ist und ich jetzt hier natürlich mit 0-JavaScript-Erfahrung rum rate und ihr merkt ohne Grundlagen wird das so nichts, bitte gleich sagen. Dann kommt das mal auf die ToDo-Liste. Der Code hat mich nur sehr neugierig gemacht.
Habe die Datei jetzt auch lokal im Browser offen und zum testen etwas mit den Texten gespielt, die Änderungen werden jedes mal korrekt angezeigt.
Grüße
Dennis