AsyncDisposableStack.prototype.adopt()

Limited availability

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

The adopt() method of AsyncDisposableStack instances registers a value that doesn't implement the async disposable protocol to the stack by providing a custom disposer function.

See DisposableStack.prototype.adopt() for general information about the adopt() method.

Syntax

js
adopt(value, onDispose)

Parameters

value

Any value to be registered to the stack.

onDispose

A function that will be called when the stack is disposed. The function receives value as its only argument, and it can return a promise which gets awaited.

Return value

The same value that was passed in.

Exceptions

TypeError

Thrown if onDispose is not a function.

ReferenceError

Thrown if the stack is already disposed.

Examples

Using adopt()

This function creates a file handle (as a Node.js FileHandle), that gets closed when the function completes. We suppose that the file handle does not implement the async disposable protocol (in reality it does), so we use adopt() to register it to the stack. Because the handle.close() method returns a promise, we need to use an AsyncDisposableStack so that the disposal gets awaited.

js
async function readFile(path) {
  await using disposer = new AsyncDisposableStack();
  const handle = disposer.adopt(
    await fs.open(path),
    async (handle) => await handle.close(),
  );
  const data = await handle.read();
  // The handle.close() method is called and awaited here before exiting
  return data;
}

Specifications

Specification
ECMAScript Async Explicit Resource Management
# sec-asyncdisposablestack.prototype.adopt

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
adopt
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