DisposableStack
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
DisposableStack オブジェクトは、ディスポーザーのスタックを表します。スタックに登録したディスポーザーは、スタック自体が破棄される時に実行されます。ディスポーザーの関数は、強力なエラーハンドリングによる保証の元、登録した順番とは逆の順番で実行されます。ディスポーザーの move() メソッドを呼び出すと、現在登録しているディスポーザーを新しい DisposableStack に呼び出す責任を移譲し、追加のディスポーザーの登録を防止します。
解説
DisposableStack は、そのインターフェイスの観点から見ると、厳密には「スタック」ではありません。ディスポーザーをスタックにプッシュするためのメソッドはいくつかありますが、ディスポーザーを一つポップする方法はありません。それどころか、スタックが破棄されるときに すべての ディスポーザーが一つずつポップされて実行されます。
DisposableStackに処分可能なリソースを登録するには、use()、adopt()、またはdefer()メソッドを使用します。
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()-
スタックに破棄可能プロトコルを実装していない値を、カスタムのディスポーザー関数を提供することで登録します。
DisposableStack.prototype.defer()-
スタックが破棄されるときに呼び出される、コールバック関数を受け取ります。
DisposableStack.prototype.dispose()-
登録された順番とは逆の順番で、スタックに登録されたすべてのディスポーザーを呼び出し、スタックを破棄します。
DisposableStack.prototype.move()-
スタック内に同じディスポーザーを含む新しい
DisposableStackインスタンスを作成し、ディスポーザーをまったく呼び出すことなくスタックを破棄済みとしてマークします。 DisposableStack.prototype.use()-
破棄可能プロトコルを実装している値をスタックに登録します。
DisposableStack.prototype[Symbol.dispose]-
dispose()メソッドのエイリアス。
仕様書
| Specification |
|---|
| ECMAScript Async Explicit Resource Management> # sec-disposablestack-objects> |