DisposableStack
DisposableStack 对象表示一个 disposer 堆栈,当堆栈本身被处置时,将运行该堆栈中的 disposer。Disposer 函数会按照注册的相反顺序执行,并提供强大的错误处理保证。调用其 move() 方法会将当前注册的 disposer 的调用责任转移到一个新的 DisposableStack,并阻止注册任何其他 disposer。
描述
从接口上看,DisposableStack 并非严格意义上的“堆栈”。它有几种方法可以向其推送 disposer,但没有方法可以从中弹出单个 disposer。相反,当堆栈被处置时,所有 disposers 都会被弹出并逐个执行。
您可以使用 DisposableStack 的 use()、adopt() 或 defer() 方法将 可处置资源 注册到 DisposableStack。
using disposer = new DisposableStack();
const reader = disposer.use(stream.getReader());
然后,当 `disposer` 离开作用域时,所有注册到它的资源都会按照注册的相反顺序被处置,除非它们已经被 move() 移出。
良好的实践是不要将资源获取表达式提取到单独的语句中,无论表达式有多长。您应该始终将 use() 或 adopt() 调用包装在资源获取表达式周围,以确保资源立即注册到堆栈中。
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 |
浏览器兼容性
加载中…