NEWS
[Gelöst] Verständnisfrage Datenpunkt für setTimeout nutzen?
-
Guten Moorgen!
Ich baue gerade an meiner Bewässerungssteuerung und da ich gern alles so dynamisch wie möglich gestalten möchte bin ich auf eine Situation gestossen wo ich mal ne Grundsatzfrage habe:
In dem Projekt gibt es arg viele Devices die jeweils eigene Timer nutzen. Ich kann diese natürlich als Array definieren aber scheinbar funktioniert das auch wenn ich das als jeweiligen Datenpunkt (Integer) zuweise.
Schön das es funktioniert doch bin ich mir nicht sicher ob das ein legitimer Weg ist. Gibt es da Gründe die dagegen sprechen?
Malc
-
Best practice ist es die timeout ids in dem Skript Lokal vorzuhalten zb in einem array oder Objekt wo sie gesetzt werden.
Die Werte in States zu persistieren mach wenig Sinn weil wenn das Skript beendet wird oder js Adapter neu gestartet wird sind die ids weg und ungültig. Im Notfall verweisen sie auf andere Timeouts. …
Gesendet vom Handy ...
-
Best practice ist es die timeout ids in dem Skript Lokal vorzuhalten zb in einem array oder Objekt wo sie gesetzt werden. `
Das macht Sinn!
In Meinem Beispiel hätte ich erwartet das beim 2. Aufruf "StartTimer(0, false);" der Bereich "log("CLEAR " + Device[id][0]);" aufgerufen wird da ich beim ersten Aufruf den Timer dem Array Device[1][1] zugeordnet habe. Das geschieht aber nicht. Vermutlich habe ich da noch nen Hänger. Ich bin noch nicht so fit in Javascript, habe ich da was übersehen?
Ich muss da mal mehr über die Gültigkeitsbereiche von Javascript lesen
Malc
var Device = []; Device[0] = ['Device1', null, 0]; Device[1] = ['Device2', null, 0]; StartTimer(0, true); StartTimer(0, false); function StartTimer(id, on) { var d = Device[id][0]; var t = Device[id][1]; var Duration = 2; if (on) { log("Start TImer für " +d ); t = setTimeout(function (){ log("Expired " + d ); clearTimeout(t); t = null; }, Duration * 5 * 1000); } else { log("OFF " + d); if(t) { log("CLEAR " + d); clearTimeout(t); } }
Edit:
Wenn ich var t = Device[id][1]; (war nur wegen der Lesbarkeit) weglasse und direkt auf das Arrayelement gehe klappt es.
Die Deklaration var t = De… ist wohl kein Zeiger, da scheint es doch im Javascript Eigenarten zu geben.
var Device = []; Device[0] = ['Device1', null, 0]; Device[1] = ['Device2', null, 0]; Device[2] = ['Device3', null, 0]; StartTimer(0, true); StartTimer(0, false); function StartTimer(id, on) { // log(Device[id][0]); //var t = Device[id][1]; //var t = x; var Duration = 2; if (on) { Device[id][1] = setTimeout(function (){ log("Expired " + Device[id][0]); clearTimeout(Device[id][1]); Device[id][1] = null; }, Duration * 5 * 1000); } else { log("OFF " + Device[id][0]); if(Device[id][1]) { log("CLEAR " + Device[id][0]); clearTimeout(Device[id][1]); } } }