NEWS
[gelöst] mehrere setTimeouts unterbrechen?
-
Ich habe mir folgendes Skript erstellt - es geht um die WLED Beleuchtung, wo mehrere definierte Presets mit einem Zeitversatz ablaufen sollen:
//Lichtschaltung Garagentor WLED const idWLED = 'wled.0.8cce4ed829ab.on'/*On / Off*/; const idWLEDFavorit = 'wled.0.8cce4ed829ab.ps'/*ID of currently set preset*/; //const idStatusTor = 'hm-rpc.3.00241A49A7696D.1.DOOR_STATE'/*00241a49a7696d:1 door state*/; const idStatusTor = 'javascript.0.Garage.Trigger'/*Trigger*/; const idHelligkeit = 'javascript.0.Bewegungsmelder.Helligkeit'/*Helligkeit*/; var dauer = 2.5; // in Sekunden var wled = getState(idWLED).val; var wledfavorit = getState(idWLEDFavorit).val; var statustor = getState(idStatusTor).val; var helligkeit = getState(idHelligkeit).val; var helligkeit_grenzwert = 300; on(idStatusTor, function(dp) { helligkeit = getState(idHelligkeit).val; if (helligkeit<helligkeit_grenzwert) { wled = getState(idWLED).val; if (dp.state.val === 3) { setState(idWLEDFavorit, 1); setState(idWLED, true); }; if (dp.state.val === 2 || dp.state.val ===1) { setState(idWLEDFavorit, 2); //gruen setTimeout(function() { setState(idWLEDFavorit, 3); //Animation }, dauer*1000); setTimeout(function() { setState(idWLEDFavorit, 4); //alles weiß }, 1.5*dauer*1000); setTimeout(function() { setState(idWLEDFavorit, 5); // Spots }, 2.10*dauer*1000); }; if(dp.state.val === 0) { setState(idWLED, false); }; }; });
Was passiert aber, wenn das Programm z.B. noch im Ablauf gerade irgendwo zwischen den Zeilen 27-30 steckt, sich dann aber durch den Trigger der Datenpunkt ändert (z.B. in den Wert 3 oder 0)? Wie kann ich dann die setTimeouts alle unterbrechen und quasi die function von vorne starten?
danke
Marcus
-
@mguenther sagte: Wie kann ich dann die setTimeouts alle unterbrechen und quasi die function von vorne starten?
Jedem setTimeout() eine eigene timer-Variable zuweisen und mit clearTimeout(timer) den Timer stoppen.
var timer1, timer2, timer3; on(idStatusTor, function(dp) { clearTimeout(timer1); clearTimeout(timer2); clearTimeout(timer3);
-
@paul53
danke Paul - das hatte ich gesucht.//Lichtschaltung Garagentor WLED const idWLED = 'wled.0.8cce4ed829ab.on'/*On / Off*/; const idWLEDFavorit = 'wled.0.8cce4ed829ab.ps'/*ID of currently set preset*/; //const idStatusTor = 'hm-rpc.3.00241A49A7696D.1.DOOR_STATE'/*00241a49a7696d:1 door state*/; const idStatusTor = 'javascript.0.Garage.Trigger'/*Trigger*/; const idHelligkeit = 'javascript.0.Bewegungsmelder.Helligkeit'/*Helligkeit*/; var dauer = 2.5; // in Sekunden var wled = getState(idWLED).val; var wledfavorit = getState(idWLEDFavorit).val; var statustor = getState(idStatusTor).val; var helligkeit = getState(idHelligkeit).val; var helligkeit_grenzwert = 300; var timer1, timer2, timer3 = null; on(idStatusTor, function(dp) { clearTimeout(timer1); clearTimeout(timer2); clearTimeout(timer3); helligkeit = getState(idHelligkeit).val; if (helligkeit<helligkeit_grenzwert) { wled = getState(idWLED).val; if (dp.state.val === 3) { setState(idWLEDFavorit, 1); setState(idWLED, true); }; if (dp.state.val === 2 || dp.state.val ===1) { setState(idWLEDFavorit, 2); //gruen timer1=setTimeout(function() { setState(idWLEDFavorit, 3); //Animation }, dauer*1000); timer2=setTimeout(function() { setState(idWLEDFavorit, 4); //alles weiß }, 1.5*dauer*1000); timer3=setTimeout(function() { setState(idWLEDFavorit, 5); // Spots }, 2.10*dauer*1000); }; if(dp.state.val === 0) { setState(idWLED, false); }; }; });
-
@mguenther du kannst dir auch alle timer in ein object schreiben und dann per schleife alle löschen
const objTimer = { timer: null, timer1: null, timer2: null }; // alle timer loeschen, falls sie bereits laufen for (const i of Object.keys(objTimer)) { if (objTimer[i]) { clearTimeout(objTimer[i]); objTimer[i] = null; }; }; objTimer.timer = setTimeout(() => { console.log('timer abgelaufen'); }, 1000); objTimer.timer1 = setTimeout(() => { console.log('timer 1 abgelaufen'); // timer 2 abbrechen falls läuft if (objTimer.timer2) { clearTimeout(objTimer.timer2); objTimer.timer2 = null; console.log('timer 2 abgebrochen'); }; }, 1000); objTimer.timer2 = setTimeout(() => { console.log('timer 2 abgelaufen'); }, 10000);
So ist es wesentlich übersichtlicher, wenn du mehrere timer in einem Skript nutzt
-
danke für den Hinweis. Ich habe Pauls Lsg umgesetzt, war für mich in dem Moment logischer - kapiere aber auch dein Vorgehen
Danke