content / files /en-us /web /javascript /reference /global_objects /asyncdisposablestack /adopt /index.md
metadata
title: AsyncDisposableStack.prototype.adopt()
short-title: adopt()
slug: Web/JavaScript/Reference/Global_Objects/AsyncDisposableStack/adopt
page-type: javascript-instance-method
browser-compat: javascript.builtins.AsyncDisposableStack.adopt
sidebar: jsref
The adopt() method of {{jsxref("AsyncDisposableStack")}} instances registers a value that doesn't implement the async disposable protocol to the stack by providing a custom disposer function.
See {{jsxref("DisposableStack.prototype.adopt()")}} for general information about the adopt() method.
Syntax
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
valueas its only argument, and it can return a promise which gets awaited.
- : A function that will be called when the stack is disposed. The function receives
Return value
The same value that was passed in.
Exceptions
- {{jsxref("TypeError")}}
- : Thrown if
onDisposeis not a function.
- : Thrown if
- {{jsxref("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.
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
{{Specifications}}
Browser compatibility
{{Compat}}
See also
- JavaScript resource management
- {{jsxref("AsyncDisposableStack")}}
- {{jsxref("AsyncDisposableStack.prototype.defer()")}}
- {{jsxref("AsyncDisposableStack.prototype.use()")}}