Node.js Timers Modul
von Node.jstimersDas Modul bietet eine Reihe von Funktionen, um Code nach einer bestimmten Zeit oder in bestimmten Intervallen wiederholt auszuführen. Diese Merkmale sind sehr nützlich für die Implementierung von verzögerter Ausführung, periodischen Aufgaben und Timeout-Steuerung.
Obwohltimersdas Modul ist ein Kernmodul von Node.js, aber seine Methoden wiesetTimeout(), setInterval()undsetImmediate()sind global verfügbar, ohne expliziten Import.
Haupt-Timer-Funktionen
setTimeout()
setTimeout()Die Funktion wird verwendet, um eine Callback-Funktion einmal nach einer angegebenen Anzahl von Millisekunden auszuführen.
Beispiel
setTimeout(() => {
console.log('Diese Nachricht wird nach 2 Sekunden angezeigt');
}, 2000);
Parameterbeschreibung
- Callback-Funktion: Die auszuführende Funktion
- Verzögerungszeit: Zeit in Millisekunden (1000 ms = 1 Sekunde)
- Optionale Parameter: Zusätzliche Parameter, die an die Callback-Funktion übergeben werden
Beispiel
setTimeout((name, age) => {
console.log(`Hallo, ${name}, du bist ${age}Jahre alt`);
}, 1000, 'Zhang San', 25);
clearTimeout()
clearTimeout()Wird verwendet, um einen zuvor eingestelltensetTimeout()Timer abzubrechen.
Beispiel
console.log('Diese Nachricht wird nicht angezeigt');
}, 2000);
clearTimeout(timerId); // Timer abbrechen
setInterval()
setInterval()Die Funktion wird verwendet, um eine Callback-Funktion in festgelegten Millisekundenintervallen wiederholt auszuführen.
Beispiel
let counter = 0;
const intervalId = setInterval(() => {
counter++;
console.log(`Dies ist die ${counter}Ausführung`);
if (counter === 5) {
clearInterval(intervalId); // Timer stoppen
}
}, 1000);
clearInterval()
clearInterval()Wird verwendet, um einen zuvor eingestelltensetInterval()wiederholenden Timer zu stoppen.
Beispiel
console.log('Diese Nachricht wird wiederholt angezeigt');
}, 1000);
// Timer nach 5 Sekunden stoppen
setTimeout(() => {
clearInterval(intervalId);
}, 5000);
setImmediate()
setImmediate()Die Funktion wird verwendet, um eine Callback-Funktion am Ende der aktuellen Ereignisschleife auszuführen.
Beispiel
setImmediate(() => {
console.log('Callback sofort ausgeführt');
});
console.log('Ende');
// Ausgabereihenfolge:
// Start
// Ende
// Callback sofort ausgeführt
clearImmediate()
clearImmediate()Wird verwendet, um einen zuvor eingestelltensetImmediate()Immediate-Callback.
Beispiel
console.log('Diese Nachricht wird nicht angezeigt');
});
clearImmediate(immediateId);
Ausführungsreihenfolge von Timern
Das Verständnis der Node.js-Event-Loop ist sehr wichtig, um die Ausführungsreihenfolge von Timern zu beherrschen. Im Folgenden wird die Ausführungsreihenfolge mehrerer Timer beschrieben:
- Synchroner Code: Wird zuerst ausgeführt
- process.nextTick(): Wird unmittelbar nach dem Ende der aktuellen Phase ausgeführt
- Promise-Callbacks: Microtask-Warteschlange
- setImmediate(): Wird nach I/O-Callbacks ausgeführt
- setTimeout() und setInterval(): Wird in der Check-Phase ausgeführt
Beispiel
setTimeout(() => console.log('setTimeout'), 0);
setImmediate(() => console.log('setImmediate'));
process.nextTick(() => console.log('nextTick'));
Promise.resolve().then(() => console.log('Promise'));
console.log('Ende');
// Typische Ausgabereihenfolge:
// Start
// Ende
// nextTick
// Promise
// setTimeout
// setImmediate
Erweiterte Nutzung und Hinweise
Timer abbrechen
Alle Timer-Funktionen geben einTimeoutObjekt zurück, das zum Abbrechen des Timers verwendet werden kann. Es ist sicher, die Abbruchfunktion aufzurufen, auch wenn der Timer bereits ausgeführt wurde.
Beispiel
clearTimeout(timeout); // Kann bedenkenlos aufgerufen werden, auch wenn der Timer bereits ausgeführt wurde
Timer-Genauigkeit
Node.js-Timer garantieren keine präzise Ausführungszeit; sie stellen eine Mindestwartezeit dar. Systemlast und andere Faktoren können die tatsächliche Ausführungszeit beeinflussen.
Speicherlecks
Vergessen zu löschensetInterval()Timer sind eine häufige Ursache für Speicherlecks. Achte darauf, Timer zu löschen, wenn sie nicht mehr benötigt werden.
Beispiel
setInterval(() => {
// Eine Operation ausführen
}, 1000);
// Korrekter Ansatz - den Timer zu einem geeigneten Zeitpunkt löschen
const interval = setInterval(() => {
// Eine Operation ausführen
if (someCondition) {
clearInterval(interval);
}
}, 1000);
Rekursives setTimeout statt setInterval
Für Aufgaben, die ein festes Intervall erfordern, deren Ausführungszeit jedoch jedes Mal unsicher ist, erweist sich die Verwendung eines rekursiven AnsatzessetTimeoutVergleichensetIntervalals zuverlässiger.
Beispiel
console.log('Aufgabe wird ausgeführt...');
// Simuliere unsichere Ausführungszeit der Aufgabe
const delay = Math.random() * 1000;
setTimeout(doSomething, 1000 + delay);
}
setTimeout(doSomething, 1000);
Praktische Anwendungsbeispiele
Implementierung eines einfachen Countdowns
Beispiel
let current = seconds;
console.log(`Countdown startet: ${current}seconds`);
const timer = setInterval(() => {
current--;
if (current <= 0) {
clearInterval(timer);
console.log('Countdown beendet!');
} else {
console.log(`Verbleibende Zeit: ${current}seconds`);
}
}, 1000);
}
countdown(5);
Behandlung von Zeitüberschreitungen bei Anfragen
Beispiel
return new Promise((resolve, reject) => {
const timeoutId = setTimeout(() => {
reject(new Error(`Zeitüberschreitung der Anfrage (${timeout}ms)`));
}, timeout);
fetch(url)
.then(response => {
clearTimeout(timeoutId);
resolve(response);
})
.catch(error => {
clearTimeout(timeoutId);
reject(error);
});
});
}
// Anwendungsbeispiel
fetchWithTimeout('https://api.example.com/data')
.then(data => console.log(data))
.catch(error => console.error(error));
Wenn Sie das Node.js-timersModul beherrschen, können Sie die Ausführungszeit von Code effektiv steuern und verschiedene zeitgesteuerte Aufgaben und asynchrone Kontrollflüsse implementieren.
Integrierte Module in Node.js