語法
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 |
瀏覽器相容性
載入中…