Symbol.asyncDispose

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

Symbol.asyncDispose 静态数据属性表示 知名符号 Symbol.asyncDisposeawait using 声明在变量离开作用域时,会查找变量初始化器上的此符号以调用相应的方法。

知名符号 Symbol.asyncDispose

Symbol.asyncDispose 的属性特性
可写
可枚举
可配置

描述

如果一个对象具有 [Symbol.asyncDispose]() 方法,那么它就是异步可处置的。该方法应具有以下语义:

  • 调用此方法会通知 AsyncDisposable 对象,调用者不再打算继续使用该对象。此方法应执行任何必要的逻辑来显式清理资源,包括但不限于文件系统句柄、流、宿主对象等。
  • 此方法可以返回一个 Promise,在继续之前将对其进行等待。
  • 当此方法抛出异常时,通常意味着资源未能被显式释放。一个 AsyncDisposable 对象在返回的 Promise 已 fulfilled 之前,不会被认为是“已处置”的。
  • 如果在同一个对象上多次调用,该函数不应抛出异常。但是,此要求并未强制执行。

示例

用户定义的异步可处置对象

[Symbol.asyncDispose] 允许创建自定义的异步可处置对象。有关更多信息,请参阅 await using 参考。

js
class Disposable {
  #fileHandle;
  #disposed;

  constructor(handle) {
    this.#disposed = false;
    this.#fileHandle = handle;
  }

  async [Symbol.asyncDispose]() {
    await this.#fileHandle.close();
    this.disposed = true;
  }

  get isDisposed() {
    return this.disposed;
  }
}

const resource = new Disposable(await fs.open("my-file.txt", "r"));
{
  await using resourceUsed = resource;
  console.log(resource.isDisposed); // false
}
console.log(resource.isDisposed); // true

规范

规范
ECMAScript 异步显式资源管理
# table-1

浏览器兼容性

另见