DisposableStack.prototype.adopt()

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

adopt() 方法用於 DisposableStack 例項,透過提供自定義的清理函式來將未實現可處置協議的值註冊到堆疊中。

語法

js
adopt(value, onDispose)

引數

value

要註冊到堆疊的任何值。

onDispose

在堆疊被處置時將被呼叫的函式。該函式接收 value 作為其唯一引數。

返回值

傳入的 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

瀏覽器相容性

另見