AsyncDisposableStack.prototype.disposeAsync()
Baseline Ограниченная доступность
Эта функция не является Baseline, так как она не работает в некоторых из наиболее широко используемых браузеров.
Метод disposeAsync() экземпляров AsyncDisposableStack освобождает этот стек, вызывая все зарегистрированные для него освобождающие функции в обратном порядке регистрации, ожидая завершения каждой перед вызовом следующей. Если стек уже освобожден, этот метод ничего не делает.
Он выполняет то же действие, что и await using disposer = new AsyncDisposableStack() при выходе из области видимости. Его можно использовать, если вам нужно выполнить очистку в точке, отличной от выхода из области видимости.
Синтаксис
disposeAsync()
Параметры
Нет.
Возвращаемое значение
Новый Promise, который разрешается с undefined, когда все зарегистрированные освобождающие функции завершились последовательно.
Исключения
disposeAsync() никогда не генерирует ошибку синхронно. Возвращаемый promise может быть отклонен с одной из следующих ошибок:
-
SuppressedError - Выбрасывается, если несколько освобождающих функций в стеке вызвали ошибку. Если выброшена только одна ошибка, она повторно выбрасывается как есть. В противном случае, для каждой дополнительной ошибки создается новый
SuppressedError, где исходная ошибка является свойствомsuppressed, а новая ошибка — свойствомerror.
Примеры
Освобождение стека
Здесь мы добавляем три освобождающие функции в стек, используя методы use(), adopt() и defer(). Когда вызывается disposeAsync(), освобождающие функции вызываются в обратном порядке регистрации.
Обратите внимание, что обычно вам не нужно вызывать disposeAsync() вручную. Объявите стек с помощью await using, и его метод [Symbol.asyncDispose]() будет автоматически вызван, когда стек выйдет из области видимости.
class Resource {
#doDisposal() {
// Imagine more meaningful disposal logic here
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();
// Logs in order:
// Deferred disposer
// Resource disposed
// Resource disposed via Symbol.dispose
}
doSomething();
Спецификации
| Спецификация |
|---|
| ECMAScript Async Explicit Resource Management # sec-asyncdisposablestack.prototype.disposeAsync |
Совместимость с браузерами
| Настольные компьютеры | Мобильные устройства | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
disposeAsync |
134 |
134 |
141 |
119 |
preview |
134 |
141 |
88 |
Нет |
29.0 |
134 |
Нет |
1.3.0 |
2.2.10 |
24.0.0 |
См. также
- Управление ресурсами JavaScript
AsyncDisposableStackAsyncDisposableStack.prototype.adopt()AsyncDisposableStack.prototype.defer()AsyncDisposableStack.prototype.use()AsyncDisposableStack.prototype[Symbol.asyncDispose]()
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncDisposableStack/disposeAsync