DisposableStack

可用性有限

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

DisposableStack 对象表示一个 disposer 堆栈,当堆栈本身被处置时,将运行该堆栈中的 disposer。Disposer 函数会按照注册的相反顺序执行,并提供强大的错误处理保证。调用其 move() 方法会将当前注册的 disposer 的调用责任转移到一个新的 DisposableStack,并阻止注册任何其他 disposer。

描述

从接口上看,DisposableStack 并非严格意义上的“堆栈”。它有几种方法可以向其推送 disposer,但没有方法可以从中弹出单个 disposer。相反,当堆栈被处置时,所有 disposers 都会被弹出并逐个执行。

您可以使用 DisposableStackuse()adopt()defer() 方法将 可处置资源 注册到 DisposableStack

js
using disposer = new DisposableStack();
const reader = disposer.use(stream.getReader());

然后,当 `disposer` 离开作用域时,所有注册到它的资源都会按照注册的相反顺序被处置,除非它们已经被 move() 移出。

良好的实践是不要将资源获取表达式提取到单独的语句中,无论表达式有多长。您应该始终将 use()adopt() 调用包装在资源获取表达式周围,以确保资源立即注册到堆栈中。

js
using disposer = new DisposableStack();
const reader = stream.getReader();
disposer.use(reader);

从功能上讲,这两个代码片段是等效的。然而,第一个代码片段出错的可能性较小,因为资源是在单行中声明和注册的。如果有人在第二个代码片段的第二行和第三行之间添加了更多代码,就可能发生错误,导致资源泄露。

构造函数

DisposableStack()

创建一个新的 DisposableStack 对象。

实例属性

这些属性定义在 DisposableStack.prototype 上,并由所有 DisposableStack 实例共享。

DisposableStack.prototype.constructor

创建实例对象的构造函数。对于 DisposableStack 实例,初始值为 DisposableStack 构造函数。

DisposableStack.prototype.disposed

只读。如果 DisposableStack 已被处置,则返回 true,否则返回 false

DisposableStack.prototype[Symbol.toStringTag]

[Symbol.toStringTag] 属性的初始值为字符串 "DisposableStack"。此属性用于 Object.prototype.toString()

实例方法

DisposableStack.prototype.adopt()

通过提供自定义的 disposer 函数,将不实现可处置协议的值注册到堆栈。

DisposableStack.prototype.defer()

接受一个回调函数,在堆栈被处置时调用该函数。

DisposableStack.prototype.dispose()

通过按照注册的相反顺序调用所有已注册的 disposers 来处置此堆栈。

DisposableStack.prototype.move()

创建一个新的 DisposableStack 实例,该实例包含与此堆栈相同的 disposers,然后将此堆栈标记为已处置,而不调用任何 disposers。

DisposableStack.prototype.use()

将实现可处置协议的值注册到堆栈。

DisposableStack.prototype[Symbol.dispose]

dispose() 方法的别名。

规范

规范
ECMAScript 异步显式资源管理
# sec-disposablestack-objects

浏览器兼容性

另见