AsyncDisposableStack.prototype.move()
Baseline Limited availability
Эта функция не является Baseline, поскольку она не работает в некоторых наиболее широко используемых браузерах.
Метод move() экземпляров AsyncDisposableStack создает новый экземпляр AsyncDisposableStack, содержащий те же освобождающие объекты, что и эта сборка, а затем помечает эту сборку как освобожденную, не вызывая никаких освобождающих объектов.
Синтаксис
move()
Параметры
Нет.
Возвращаемое значение
Новый экземпляр AsyncDisposableStack.
Исключения
-
ReferenceError - Выбрасывается, если сборка уже освобождена.
Примеры
Передача владения сборкой
async function consumeStack(stack) {
await using newStack = stack.move(); // newStack now owns the disposers
console.log(stack.disposed); // true
console.log(newStack.disposed); // false
// newStack is disposed here immediately before the function exits
}
const stack = new AsyncDisposableStack();
console.log(stack.disposed); // false
await consumeStack(stack);
console.log(stack.disposed); // true
Разрешение освобождения ресурсов в двух путях кода
Основной сценарий использования move() заключается в том, когда у вас есть один или несколько ресурсов, которые могут быть освобождены здесь прямо сейчас или могут быть сохранены для последующего использования. В этом случае вы можете поместить ресурсы в AsyncDisposableStack, а затем вызвать move(), когда вам нужно сохранить ресурсы для последующего использования.
class PluginHost {
#disposed = false;
#disposables;
#channel;
#socket;
static async init() {
// Create an AsyncDisposableStack that is disposed when init exits.
// If construction succeeds, we move everything out of `stack` and into
// `#disposables` to be disposed later.
await using stack = new AsyncDisposableStack();
const channel = stack.use(await getChannel());
const socket = stack.use(await getSocket());
// If we made it here, then there were no errors during construction and
// we can safely move the disposables out of `stack`.
return new PluginHost(channel, socket, stack.move());
// If construction failed, then `stack` would be disposed before reaching
// the line above, which would dispose `channel` and `socket` in turn.
}
constructor(channel, socket, disposables) {
this.#channel = channel;
this.#socket = socket;
this.#disposables = disposables;
}
async [Symbol.asyncDispose]() {
if (this.#disposed) {
return;
}
this.#disposed = true;
// Put `this.#disposables` into a `using` variable, so it is automatically
// disposed when the function exits.
await using disposables = this.#disposables;
// NOTE: we can free `#socket` and `#channel` here since they will be
// disposed by the call to `disposables[Symbol.asyncDispose]()`, below.
// This isn't strictly a requirement for every disposable, but is
// good housekeeping since these objects will no longer be useable.
this.#socket = undefined;
this.#channel = undefined;
this.#disposables = undefined;
}
}
Спецификации
| Specification |
|---|
| ECMAScript Async Explicit Resource Management # sec-asyncdisposablestack.prototype.move |
Совместимость с браузерами
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 | |
move |
134 |
134 |
141 |
119 |
preview |
134 |
141 |
88 |
No |
29.0 |
134 |
No |
1.3.0 |
2.2.10 |
24.0.0 |
См. также
- Управление ресурсами в JavaScript
AsyncDisposableStackAsyncDisposableStack.prototype.disposeAsync()
© 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/move