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

js
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 als suppressed-Eigenschaft und der neue Fehler als error-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.

js
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

Browser-Kompatibilität

Siehe auch