JavaScript DisposableStack

原创
admin 4个月前 (08-19) 阅读数 25 #JavaScript

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

浏览器兼容性

另请参阅

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权本站发表,未经许可,不得转载。

作者文章
热门
最新文章
标签列表