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 |
浏览器兼容性
加载中…