AsyncDisposableStack.prototype.disposeAsync()
Die disposeAsync()
-Methode von AsyncDisposableStack
-Instanzen entsorgt diesen Stack, indem sie alle registrierten Disposer in umgekehrter Reihenfolge ihrer Registrierung aufruft und auf den Abschluss jedes Einzelnen wartet, bevor sie den nächsten aufruft. Wenn der Stack bereits entsorgt ist, macht diese Methode nichts.
Sie führt dieselbe Aktion aus wie await using disposer = new AsyncDisposableStack()
beim Verlassen des Geltungsbereichs. Sie kann verwendet werden, wenn Sie an einem anderen Punkt als dem Geltungsbereichsende bereinigen müssen.
Syntax
disposeAsync()
Parameter
Keine.
Rückgabewert
Ein neues Promise
, das mit undefined
aufgelöst wird, wenn alle registrierten Disposer der Reihe nach abgeschlossen sind.
Ausnahmen
disposeAsync()
wirft niemals synchron einen Fehler. Das zurückgegebene Promise kann mit einem der folgenden Fehler abgelehnt werden:
SuppressedError
-
Wird ausgelöst, wenn mehrere Disposer im Stack einen Fehler geworfen haben. Wenn nur ein Fehler auftritt, wird dieser direkt wieder geworfen. Andernfalls wird für jeden zusätzlichen Fehler ein neuer
SuppressedError
erstellt, wobei der ursprüngliche Fehler alssuppressed
-Eigenschaft und der neue Fehler alserror
-Eigenschaft angegeben wird.
Beispiele
Entsorgung eines Stacks
Hier fügen wir dem Stack drei Disposer hinzu, indem wir die Methoden use()
, adopt()
und defer()
verwenden. Wenn disposeAsync()
aufgerufen wird, werden die Disposer in umgekehrter Reihenfolge ihrer Registrierung aufgerufen.
Beachten Sie, dass Sie disposeAsync()
normalerweise nicht manuell aufrufen müssen. Deklarieren Sie den Stack mit await using
, und seine [Symbol.asyncDispose]()
-Methode wird automatisch aufgerufen, wenn der Stack den Geltungsbereich 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
Specification |
---|
ECMAScript Async Explicit Resource Management # sec-asyncdisposablestack.prototype.disposeAsync |