DisposableStack.prototype.use()

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

The use() method of DisposableStack instances registers a value that implements the disposable protocol to the stack.

Syntax

js
use(value)

Parameters

value

The value to register to the stack. Must either contain a [Symbol.dispose]() method, or be null or undefined.

Return value

The same value that was passed in.

Exceptions

TypeError

Thrown if value is not null or undefined, and does not contain a [Symbol.dispose]() method.

ReferenceError

Thrown if the stack is already disposed.

Description

The primary purpose of use() is to register a value that implements the disposable protocol to the stack, as the equivalent of the using declaration. If the value does not implement the disposable protocol (it doesn't have the [Symbol.dispose]() method), use adopt() instead, passing a callback that calls the resource's cleanup method.

You should make your resource registered as soon as it's declared. This means you should always wrap your resource acquisition expression in use(), instead of extracting it to a separate statement.

js
using disposer = new DisposableStack();
const reader = stream.getReader();
disposer.use(reader);

Examples

Using use()

This code consumes a ReadableStream via a ReadableStreamDefaultReader. The reader is automatically closed when the function completes, assuming it implements a [Symbol.dispose]() method that synchronously releases the lock on the stream.

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

Specifications

Specification
ECMAScript Async Explicit Resource Management
# sec-disposablestack.prototype.use

Browser compatibility

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
use
Chrome – Full support
Chrome 134 (Release date: 2025-03-04)
footnote Full support
Edge – Full support
Edge 134 (Release date: 2025-03-06)
footnote Full support
Firefox – Full support
Firefox 141 (Release date: 2025-07-22)
footnote Full support
Opera – Full support
Opera 119 (Release date: 2025-05-13)
footnote Full support
Safari – No support
Safari
footnote No support
Chrome Android – Full support
Chrome Android 134 (Release date: 2025-03-04)
footnote Full support
Firefox for Android – Full support
Firefox for Android 141 (Release date: 2025-07-22)
footnote Full support
Opera Android – Full support
Opera Android 88 (Release date: 2025-03-19)
footnote Full support
Safari on iOS – No support
Safari on iOS
footnote No support
Samsung Internet – Full support
Samsung Internet 29 (Release date: 2025-10-25)
footnote Full support
WebView Android – Full support
WebView Android 134 (Release date: 2025-03-04)
footnote Full support
WebView on iOS – No support
WebView on iOS
footnote No support
Bun – Full support
Bun 1.3 (Release date: 2025-10-10)
footnote Full support
Deno – Full support
Deno 2.2.10 (Release date: 2025-04-15)
footnote Full support
Node.js – Full support
Node.js 24 (Release date: 2025-05-06)
footnote Full support

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
No support
No support

See also