Spec-Zone.ru › JavaScript

DisposableStack.prototype.adopt()

Baseline Ограниченная доступность

Эта функция не является Baseline, так как она не работает в некоторых наиболее широко используемых браузерах.

Метод adopt() экземпляров DisposableStack регистрирует значение, которое не реализует протокол disposable, в стеке, предоставляя пользовательскую функцию очистки.

Синтаксис

adopt(value, onDispose)

Параметры

value
Любое значение, которое будет зарегистрировано в стеке.
onDispose
Функция, которая будет вызвана при очистке стека. Функция получает value в качестве единственного аргумента.

Возвращаемое значение

То же value, которое было передано.

Исключения

TypeError
Выбрасывается, если onDispose не является функцией.
ReferenceError
Выбрасывается, если стек уже очищен.

Описание

Основная цель adopt() — зарегистрировать значение, которое не реализует протокол disposable, в стеке. Если значение уже disposable, вы можете использовать use() вместо этого, который автоматически использует метод [Symbol.dispose]() значения в качестве очистки.

adopt(value, onDispose) почти так же, как defer(() => onDispose(value)), но он позволяет объявить ресурс и зарегистрировать его в одной строке. Таким образом, существует минимальная вероятность ошибки между созданием ресурса и его регистрацией, которая приведет к утечке ресурса.

using disposer = new DisposableStack();
const reader = disposer.adopt(stream.getReader(), (reader) =>
  reader.releaseLock(),
);
using disposer = new DisposableStack();
const reader = stream.getReader();
// If someone adds code in between these lines and an error occurs,
// the stream will be locked forever.
disposer.defer(() => reader.close());

В том же духе "сделайте ваш ресурс зарегистрированным, как только он будет объявлен", вы всегда должны заключать выражение получения ресурса в adopt(), вместо того чтобы извлекать его в отдельное выражение.

using disposer = new DisposableStack();
const reader = stream.getReader();
disposer.adopt(reader, (reader) => reader.close());

Примеры

Использование adopt()

Этот код потребляет ReadableStream через ReadableStreamDefaultReader. Читатель не реализует протокол disposable, поэтому мы используем adopt() для его регистрации в стеке.

{
  using disposer = new DisposableStack();
  const reader = disposer.adopt(stream.getReader(), (reader) =>
    reader.releaseLock(),
  );
  const { value, done } = reader.read();
  if (!done) {
    // Process the value
  }
  // The reader.releaseLock() method is called here before exiting
}

Спецификации

Спецификация
ECMAScript Async Explicit Resource Management
# sec-asyncdisposablestack.prototype.adopt

Совместимость с браузерами

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
adopt
134
134
141
119
preview
134
141
88
No
29.0
134
No
1.3.0
2.2.10
24.0.0

См. также

  • Управление ресурсами JavaScript
  • DisposableStack
  • DisposableStack.prototype.defer()
  • DisposableStack.prototype.use()

© 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/DisposableStack/adopt

Spec-Zone.ru

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