@apollon77:
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]);
}
}
}