AsyncDisposableStack.prototype.disposeAsync()

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

AsyncDisposableStack 例項的 disposeAsync() 方法會按照與註冊時相反的順序呼叫所有註冊的清理器來清理此堆疊,在呼叫下一個清理器之前會等待前一個清理器完成。如果堆疊已經清理,此方法不執行任何操作。

它執行的操作與作用域退出時的 await using disposer = new AsyncDisposableStack() 相同。如果你需要在作用域退出之外的某個時間點進行清理,則可以使用它。

語法

js
disposeAsync()

引數

無。

返回值

當所有註冊的清理器按順序完成後,會解析為 undefined 的新 Promise

異常

disposeAsync() 永遠不會同步丟擲錯誤。返回的 promise 可能會因以下錯誤之一而被拒絕:

SuppressedError

如果堆疊中的多個清理器丟擲錯誤,則會丟擲此錯誤。如果只丟擲一個錯誤,則會按原樣重新丟擲。否則,對於每個額外的錯誤,都會建立一個新的 SuppressedError,其中原始錯誤作為 suppressed 屬性,新錯誤作為 error 屬性。

示例

清理堆疊

在這裡,我們使用 use()adopt()defer() 方法將三個清理器推入堆疊。呼叫 disposeAsync() 時,會按照與註冊時相反的順序呼叫清理器。

請注意,通常不需要手動呼叫 disposeAsync()。使用 await using 宣告堆疊,當堆疊超出作用域時,其 [Symbol.asyncDispose]() 方法將自動呼叫。

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();

規範

規範
ECMAScript 非同步顯式資源管理
# sec-asyncdisposablestack.prototype.disposeAsync

瀏覽器相容性

另見