Ich vermute, dass dies ein Duplikat wegen der einfachen Natur der Frage sein könnte, aber ich konnte keine Antwort finden.Reset Timeout des gleichen Timers in einer for-Schleife in Javascript
Ich stelle eine Timeout-Funktion in einer Foor-Schleife ein, wenn eine bestimmte Bedingung zutrifft. Da ich das Timeout nicht innerhalb der Schleife deklarieren möchte, habe ich eine setTimeout-Funktion geschrieben, um es außerhalb zu setzen. Ich möchte nur einen Timer verwenden, der zurückgesetzt wird, wenn er bereits läuft, andernfalls sollte der Timer das erste Mal eingestellt werden. Mein Problem ist, dass die Funktion mehrere Timer setzt, obwohl ich eine clearTimeout() verwende.
Mein Code:
var timeout_id;
var things = [true, true, false, true, true];
var setTimer = function(timer_id, duration) {
console.log("timer_id: ", timer_id);
// clear timeout of the given Id
clearTimeout(timer_id);
timer_id = setTimeout(function() {
// reset flag
console.log("Timer timed out");
}, duration);
console.log("timer_id: ", timer_id);
};
for (var i = things.length - 1; i >= 0; i--) {
if (things[i]) {
setTimer(timeout_id, 900);
console.log("Timer set because value of : " + i + " = ", things[i]);
}
}
Was ich in der Konsole ist:
timer_id: undefined
timer_id: 1
Timer set because value of : 4 = true
timer_id: undefined
timer_id: 2
Timer set because value of : 3 = true
timer_id: undefined
timer_id: 3
Timer set because value of : 1 = true
timer_id: undefined
timer_id: 4
Timer set because value of : 0 = true
timer timed out
timer timed out
timer timed out
timer timed out
Ich verstehe nicht, warum meine timer_id jedes Mal erhöht wird.
Ich gebe die ID und setzen Sie den Timer von ihm. Danach setze ich einen Timer auf die gleiche ID, oder? Wird der Verweis auf die Variable var timeout_id nicht angegeben und ändert er sich innerhalb der setTimer-Funktion?
Danke für die Hilfe.
Sie passieren ' timer_id 'zu der Funktion und Sie setzen das auf setTimeout (...) Wollen Sie nicht stattdessen die Variable' timeout_id 'des äußeren Bereichs verwenden? –
Ich wollte das nicht, weil ich die setTimer-Funktion bei verschiedenen Timer-Variablen aufrufen möchte. Aber überprüfe meine Antwort. Ich denke, ich habe dort eine Lösung gefunden. – Merc