AbortSignal: timeout() statische Methode
Baseline 2024>
Neu verfügbar
Seit April 2024 funktioniert diese Funktion auf aktuellen Geräten und in aktuellen Browserversionen. Auf älteren Geräten oder in älteren Browsern funktioniert sie möglicherweise nicht.
Hinweis: Diese Funktion ist in Web Workers verfügbar.
Die AbortSignal.timeout() statische Methode gibt ein AbortSignal zurück, das automatisch nach einer angegebenen Zeit abbricht.
Das Signal bricht bei einem Timeout mit einem TimeoutError DOMException ab.
Das Timeout basiert auf der aktiven Zeit und nicht auf der verstrichenen Zeit und wird effektiv angehalten, wenn der Code in einem angehaltenen Worker ausgeführt wird oder während das Dokument im Back-Forward-Cache ("bfcache") ist.
Um mehrere Signale zu kombinieren, können Sie AbortSignal.any() verwenden, zum Beispiel, um einen Download direkt entweder mit einem Timeout-Signal oder durch Aufruf von AbortController.abort() abzubrechen.
Syntax
AbortSignal.timeout(time)
Parameter
time-
Die "aktive" Zeit in Millisekunden, bevor das zurückgegebene
AbortSignalabbricht. Der Wert muss im Bereich zwischen 0 undNumber.MAX_SAFE_INTEGERliegen.
Rückgabewert
Ein AbortSignal.
Das Signal wird mit seiner AbortSignal.reason Eigenschaft, die auf einen TimeoutError DOMException gesetzt ist, bei einem Timeout abgebrochen.
Beschreibung
AbortSignal.timeout() bietet keine Möglichkeit, seinen Timeout zu kündigen. Das frühzeitige Beenden der Operation oder das Abbrechen eines anderen Signals, das mit ihm über AbortSignal.any() kombiniert wurde, beendet den Timeout nicht.
Solange der Timeout noch aussteht, bleibt das Signal am Leben, wenn es abort Ereignislistener hat. Entfernen Sie Listener, die von Ihrem Code hinzugefügt wurden, wenn sie nicht mehr benötigt werden, anstatt zu warten, bis der Timeout abläuft. Das Erstellen von langen Timeouts mit Listenern kann die Speicherbereinigung verhindern, selbst nachdem der Anwendungscode seine Verweise auf das Signal gelöscht hat.
Das Unzugänglichwerden des AbortSignal garantiert nicht die Beendigung des Timeouts. Wenn die Ressourcen begrenzt sind und Sie Timeouts vorzeitig definitiv beenden möchten, verwenden Sie einen AbortController mit setTimeout() und rufen Sie clearTimeout() auf, wenn die Operation beendet ist.
Beispiele
Unten ist ein Beispiel, das eine Fetch-Operation zeigt, die nach 5 Sekunden fehlschlägt, falls sie nicht erfolgreich ist. Beachten Sie, dass dies auch fehlschlagen kann, wenn die Methode nicht unterstützt wird, wenn ein "Stopp"-Button im Browser gedrückt wird oder aus einem anderen Grund.
const url = "https://path_to_large_file.mp4";
try {
const res = await fetch(url, { signal: AbortSignal.timeout(5000) });
const result = await res.blob();
// …
} catch (err) {
if (err.name === "TimeoutError") {
// This exception is from the abort signal
console.error("Timeout: It took more than 5 seconds to get the result!");
} else if (err.name === "AbortError") {
// This exception is from the fetch itself
console.error(
"Fetch aborted by user action (browser stop button, closing tab, etc.",
);
} else if (err.name === "TypeError") {
console.error("AbortSignal.timeout() method is not supported");
} else {
// A network error, or some other problem.
console.error(`Error: type: ${err.name}, message: ${err.message}`);
}
}
Spezifikationen
| Spezifikation |
|---|
| DOM> # ref-for-dom-abortsignal-timeout①> |