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

浏览器兼容性

另见