DisposableStack

可用性有限

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

DisposableStack 物件表示一個 disposer 堆疊,當堆疊本身被處置時,將執行該堆疊中的 disposer。Disposer 函式會按照註冊的相反順序執行,並提供強大的錯誤處理保證。呼叫其 move() 方法會將當前註冊的 disposer 的呼叫責任轉移到一個新的 DisposableStack,並阻止註冊任何其他 disposer。

描述

從介面上看,DisposableStack 並非嚴格意義上的“堆疊”。它有幾種方法可以向其推送 disposer,但沒有方法可以從中彈出單個 disposer。相反,當堆疊被處置時,所有 disposers 都會被彈出並逐個執行。

您可以使用 DisposableStackuse()adopt()defer() 方法將 可處置資源 註冊到 DisposableStack

js
using disposer = new DisposableStack();
const reader = disposer.use(stream.getReader());

然後,當 `disposer` 離開作用域時,所有註冊到它的資源都會按照註冊的相反順序被處置,除非它們已經被 move() 移出。

良好的實踐是不要將資源獲取表示式提取到單獨的語句中,無論表示式有多長。您應該始終將 use()adopt() 呼叫包裝在資源獲取表示式周圍,以確保資源立即註冊到堆疊中。

js
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 函式,將不實現可處置協議的值註冊到堆疊。

DisposableStack.prototype.defer()

接受一個回撥函式,在堆疊被處置時呼叫該函式。

DisposableStack.prototype.dispose()

透過按照註冊的相反順序呼叫所有已註冊的 disposers 來處置此堆疊。

DisposableStack.prototype.move()

建立一個新的 DisposableStack 例項,該例項包含與此堆疊相同的 disposers,然後將此堆疊標記為已處置,而不呼叫任何 disposers。

DisposableStack.prototype.use()

將實現可處置協議的值註冊到堆疊。

DisposableStack.prototype[Symbol.dispose]

dispose() 方法的別名。

規範

規範
ECMAScript 非同步顯式資源管理
# sec-disposablestack-objects

瀏覽器相容性

另見