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
DisposableStackDisposableStack.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