このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

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()メソッドを使用します。

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()

スタックに破棄可能プロトコルを実装していない値を、カスタムのディスポーザー関数を提供することで登録します。

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

ブラウザーの互換性

関連情報