AsyncDisposableStack.prototype.move()
The move()
method of AsyncDisposableStack
instances creates a new AsyncDisposableStack
instance that contains the same disposers as this stack, and then marks this stack as disposed, without calling any disposers.
Syntax
move()
Parameters
None.
Return value
A new AsyncDisposableStack
instance.
Exceptions
ReferenceError
-
Thrown if the stack is already disposed.
Examples
Claiming ownership of a stack
async function consumeStack(stack) {
await using newStack = stack.move(); // newStack now owns the disposers
console.log(stack.disposed); // true
console.log(newStack.disposed); // false
// newStack is disposed here immediately before the function exits
}
const stack = new AsyncDisposableStack();
console.log(stack.disposed); // false
await consumeStack(stack);
console.log(stack.disposed); // true
Allowing resources to be disposed within two code paths
The major use case of move()
is when you have one or more resources which could either be disposed right here or could be persisted for later use. In this case, you can put the resources in a AsyncDisposableStack
and then call move()
when you need to persist the resources for later usage.
class PluginHost {
#disposed = false;
#disposables;
#channel;
#socket;
static async init() {
// Create a AsyncDisposableStack that is disposed when init exits.
// If construction succeeds, we move everything out of `stack` and into
// `#disposables` to be disposed later.
await using stack = new AsyncDisposableStack();
const channel = stack.use(await getChannel());
const socket = stack.use(await getSocket());
// If we made it here, then there were no errors during construction and
// we can safely move the disposables out of `stack`.
return new PluginHost(channel, socket, stack.move());
// If construction failed, then `stack` would be disposed before reaching
// the line above, which would dispose `channel` and `socket` in turn.
}
constructor(channel, socket, disposables) {
this.#channel = channel;
this.#socket = socket;
this.#disposables = disposables;
}
[Symbol.asyncDispose]() {
if (this.#disposed) {
return;
}
this.#disposed = true;
// Put `this.#disposables` into a `using` variable, so it is automatically
// disposed when the function exits.
await using disposables = this.#disposables;
// NOTE: we can free `#socket` and `#channel` here since they will be
// disposed by the call to `disposables[Symbol.asyncDispose]()`, below.
// This isn't strictly a requirement for every disposable, but is
// good housekeeping since these objects will no longer be useable.
this.#socket = undefined;
this.#channel = undefined;
this.#disposables = undefined;
}
}
Specifications
No specification found
No specification data found for javascript.builtins.AsyncDisposableStack.move
.
Check for problems with this page or contribute a missing spec_url
to mdn/browser-compat-data. Also make sure the specification is included in w3c/browser-specs.