JavaScript DisposableStack
原创DisposableStack
DisposableStack对象表示一个disposer堆栈,当堆栈本身被处置时,这些disposer会被执行。disposer函数按照注册的逆序执行,并具有强大的错误处理保证。调用其move()方法会将当前注册的disposer的调用责任转移到新的DisposableStack,并阻止注册任何额外的disposer。
描述
从接口的角度来看,DisposableStack并不完全是一个"堆栈"。它有多种方法可以将disposer推入其中,但没有办法单独弹出一个disposer。相反,当堆栈被处置时,所有的disposer都会被弹出并逐一执行。
您可以使用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函数,将未实现disposable协议的值注册到堆栈。
DisposableStack.prototype.defer()-
接受一个在堆栈被处置时调用的回调函数。
DisposableStack.prototype.dispose()-
通过按照注册的逆序调用所有注册到它的disposer来处置此堆栈。
DisposableStack.prototype.move()-
创建一个新的DisposableStack实例,其中包含与此堆栈相同的disposer,然后将此堆栈标记为已处置,而不调用任何disposer。
DisposableStack.prototype.use()-
将实现disposable协议的值注册到堆栈。
DisposableStack.prototype[Symbol.dispose]-
dispose()方法的别名。
规范
| 规范 |
|---|
| ECMAScript Async Explicit Resource Management # sec-disposablestack-objects |
浏览器兼容性
另请参阅
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权本站发表,未经许可,不得转载。
开发学习网




