AsyncDisposableStack.prototype.disposeAsync()
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
AsyncDisposableStack インスタンスの disposeAsync() メソッドは、登録されているすべてのディスポーザーを登録順とは逆の順序で呼び出し、各ディスポーザーの完了を待ってから次のディスポーザーを呼び出すことで、このスタックを破棄します。スタックがすでに解放されている場合、このメソッドは何も行いません。
これは、スコープ終了時に await using disposer = new AsyncDisposableStack() と同じ処理を実行します。スコープ終了時以外の場所でクリーンアップが必要な場合に使用できます。
構文
disposeAsync()
引数
なし。
返値
登録されているすべてのディスポーザーが順番に完了したときに、undefined で解決される新しい Promise。
例外
disposeAsync() は同期的にエラーをスローすることはありません。返されるプロミスは、次のいずれかのエラーで拒否される可能性があります。
SuppressedError-
スタック内の複数のディスポーザーがエラーをスローした場合に発生します。 エラーが 1 つだけの場合は、そのエラーがそのまま再スローされます。追加のエラーごとに新しい
SuppressedErrorが作成され、元のエラーはsuppressedプロパティに、新しいエラーはerrorプロパティに設定されます。
例
>スタックの破棄
ここでは、use()、adopt()、defer() メソッドを使って、3 つのディスポーザーをスタックに追加します。disposeAsync() を呼び出すと、ディスポーザーは登録した順序とは逆の順序で呼び出されます。
通常、disposeAsync() を手動で呼び出す必要はありません。スタックを await using で宣言すると、スコープを抜けるときに [Symbol.asyncDispose]() メソッドが自動的に呼び出されます。
class Resource {
#doDisposal() {
// ここでは、より実用的な解放処理が行われると想定してください
return new Promise((resolve) => {
setTimeout(resolve, 1000);
});
}
async dispose() {
await this.#doDisposal();
console.log("Resource disposed");
}
async [Symbol.asyncDispose]() {
await this.#doDisposal();
console.log("Resource disposed via Symbol.asyncDispose");
}
}
async function doSomething() {
const disposer = new AsyncDisposableStack();
const resource = disposer.use(new Resource());
const resource2 = disposer.adopt(new Resource(), (resource) =>
resource.dispose(),
);
disposer.defer(() => console.log("Deferred disposer"));
disposer.disposeAsync();
// 次の順序でログ出力されます:
// Deferred disposer
// Resource disposed
// Resource disposed via Symbol.dispose
}
doSomething();
仕様書
| Specification |
|---|
| ECMAScript Async Explicit Resource Management> # sec-asyncdisposablestack.prototype.disposeAsync> |