AsyncDisposableStack.prototype.disposeAsync()
Eingeschränkt verfügbar
Diese Funktion ist nicht Baseline, da sie in einigen der am weitesten verbreiteten Browser nicht funktioniert.
Want more browser support for this feature? Tell us why.
Die Methode disposeAsync() von AsyncDisposableStack-Instanzen gibt diesen Stack frei, indem sie alle darin registrierten Disposer in umgekehrter Reihenfolge ihrer Registrierung aufruft. Sie wartet jeweils auf den Abschluss eines Disposers, bevor sie den nächsten aufruft. Wenn der Stack bereits freigegeben wurde, bewirkt diese Methode nichts.
Sie führt dieselbe Aktion aus wie await using disposer = new AsyncDisposableStack() beim Verlassen des Gültigkeitsbereichs. Sie können sie verwenden, wenn die Bereinigung zu einem anderen Zeitpunkt erfolgen soll.
Syntax
disposeAsync()
Parameter
Keine.
Rückgabewert
Ein neues Promise, das mit undefined erfüllt wird, sobald alle registrierten Disposer nacheinander abgeschlossen wurden.
Ausnahmen
disposeAsync() löst niemals synchron einen Fehler aus. Das zurückgegebene Promise kann mit einem der folgenden Fehler zurückgewiesen werden:
SuppressedError-
Wird ausgelöst, wenn mehrere Disposer im Stack einen Fehler ausgelöst haben. Wenn nur ein Fehler ausgelöst wird, wird er unverändert weitergegeben. Andernfalls wird für jeden weiteren Fehler ein neuer
SuppressedErrorerstellt, dessensuppressed-Eigenschaft den ursprünglichen Fehler und dessenerror-Eigenschaft den neuen Fehler enthält.
Beispiele
>Einen Stack freigeben
Hier fügen wir dem Stack mit den Methoden use(), adopt() und defer() drei Disposer hinzu. Beim Aufruf von disposeAsync() werden die Disposer in umgekehrter Reihenfolge ihrer Registrierung aufgerufen.
Normalerweise müssen Sie disposeAsync() nicht manuell aufrufen. Deklarieren Sie den Stack mit await using; seine Methode [Symbol.asyncDispose]() wird dann automatisch aufgerufen, wenn der Stack den Gültigkeitsbereich verlässt.
class Resource {
#doDisposal() {
// Imagine more meaningful disposal logic here
return new Promise((resolve) => {
setTimeout(resolve, 1000);
});
}
async dispose() {
await this.#doDisposal();
console.log("Resource disposed");
}
async [Symbol.asyncDispose]() {
await this.#doDisposal();
console.log("Resource disposed via Symbol.asyncDispose");
}
}
async function doSomething() {
const disposer = new AsyncDisposableStack();
const resource = disposer.use(new Resource());
const resource2 = disposer.adopt(new Resource(), (resource) =>
resource.dispose(),
);
disposer.defer(() => console.log("Deferred disposer"));
disposer.disposeAsync();
// Logs in order:
// Deferred disposer
// Resource disposed
// Resource disposed via Symbol.dispose
}
doSomething();
Spezifikationen
| Spezifikation |
|---|
| ECMAScript Async Explicit Resource Management> # sec-asyncdisposablestack.prototype.disposeAsync> |