Spec-Zone.ru › JavaScript

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
  • AsyncDisposableStack
  • AsyncDisposableStack.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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API