语法
js
adopt(value, onDispose)
参数
返回值
传入的 value 相同。
异常
TypeError-
如果
onDispose不是函数,则抛出异常。 ReferenceError-
如果堆栈已被处置,则抛出异常。
描述
adopt() 的主要目的是将未实现可处置协议的值注册到堆栈中。如果该值已实现可处置协议,您可以使用 use() 代替,它会自动使用该值的 [Symbol.dispose]() 方法作为清理函数。
adopt(value, onDispose) 几乎等同于 defer(() => onDispose(value)),但它允许您在同一行声明资源并进行注册。这样,在资源创建和注册之间发生错误的几率降到最低,从而避免资源泄露。
js
using disposer = new DisposableStack();
const reader = disposer.adopt(stream.getReader(), (reader) =>
reader.releaseLock(),
);
js
using disposer = new DisposableStack();
const reader = stream.getReader();
// If someone adds code in between these lines and an error occurs,
// the stream will be locked forever.
disposer.defer(() => reader.close());
秉承“在声明资源时尽快注册它”的精神,您应该始终将资源获取表达式包装在 adopt() 中,而不是将其提取到单独的语句中。
js
using disposer = new DisposableStack();
const reader = stream.getReader();
disposer.adopt(reader, (reader) => reader.close());
示例
使用 adopt()
此代码通过 ReadableStreamDefaultReader 使用 ReadableStream。读取器未实现可处置协议,因此我们使用 adopt() 将其注册到堆栈。
js
{
using disposer = new DisposableStack();
const reader = disposer.adopt(stream.getReader(), (reader) =>
reader.releaseLock(),
);
const { value, done } = reader.read();
if (!done) {
// Process the value
}
// The reader.releaseLock() method is called here before exiting
}
规范
| 规范 |
|---|
| ECMAScript 异步显式资源管理 # sec-asyncdisposablestack.prototype.adopt |
浏览器兼容性
加载中…