AsyncDisposableStack.prototype.move()
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
AsyncDisposableStack ã¤ã³ã¹ã¿ã³ã¹ã® move() ã¡ã½ããã¯ããã®ã¹ã¿ãã¯ã¨åããã£ã¹ãã¼ã¶ã¼ãå«ãæ°ãã AsyncDisposableStack ã¤ã³ã¹ã¿ã³ã¹ã使ãããã®å¾ãã£ã¹ãã¼ã¶ã¼ãå¼ã³åºããã¨ãªãããã®ã¹ã¿ãã¯ãç ´æ£æ¸ã¿ã¨ãã¦ãã¼ã¯ãã¾ãã
æ§æ
move()
弿°
ãªãã
è¿å¤
æ°ãã AsyncDisposableStack ã¤ã³ã¹ã¿ã³ã¹ã
ä¾å¤
ReferenceError-
ã¹ã¿ãã¯ããã§ã«ç ´æ£ããã¦ããå ´åã«ã¹ãã¼ããã¾ãã
ä¾
>ã¹ã¿ãã¯ã®æææ¨©ãåå¾ãã
async function consumeStack(stack) {
await using newStack = stack.move(); // newStack ããã£ã¹ãã¼ã¶ã¼ã®æææ¨©ãæã¡ã¾ã
console.log(stack.disposed); // true
console.log(newStack.disposed); // false
// 颿°ãçµäºããç´åã« newStack ã¯ç ´æ£ããã¾ã
}
const stack = new AsyncDisposableStack();
console.log(stack.disposed); // false
await consumeStack(stack);
console.log(stack.disposed); // true
2 ã¤ã®ã³ã¼ããã¹ã§ãªã½ã¼ã¹ãç ´æ£ã§ããããã«ãã
move() ã®ä¸»ãªç¨éã¯ã1 ã¤ä»¥ä¸ã®ãªã½ã¼ã¹ãããããããããã®å ´ã§ç ´æ£ããããå¾ã§ä½¿ãããã«ä¿æãããã鏿ã§ããå ´åã§ãããã®å ´åã¯ããªã½ã¼ã¹ã AsyncDisposableStack ã«æ ¼ç´ããå¾ã§ä½¿ç¨ããããã«ä¿æããå¿
è¦ãããå ´åã« move() ãå¼ã³åºãã¾ãã
class PluginHost {
#disposed = false;
#disposables;
#channel;
#socket;
static async init() {
// init ã®çµäºæã«ç ´æ£ããã AsyncDisposableStack ã使ãã¾ãã
// æ§ç¯ãæåããå ´åã¯ã`stack` å
ã®ãã¹ã¦ã `#disposables` ã«ç§»ãã
// å¾ã§ç ´æ£ãããããã«ãã¾ãã
await using stack = new AsyncDisposableStack();
const channel = stack.use(await getChannel());
const socket = stack.use(await getSocket());
// ããã¾ã§å°éããå ´åãæ§ç¯ä¸ã«ã¨ã©ã¼ã¯çºçãã¦ãããã
// `stack` ãããã£ã¹ãã¼ã¶ã¼ãå®å
¨ã«ç§»åã§ãã¾ãã
return new PluginHost(channel, socket, stack.move());
// æ§ç¯ã«å¤±æããå ´åããã®è¡ã«å°éããåã« `stack` ãç ´æ£ããã
// ããã«ä¼´ã£ã¦ `channel` 㨠`socket` ãé ã«ç ´æ£ããã¾ãã
}
constructor(channel, socket, disposables) {
this.#channel = channel;
this.#socket = socket;
this.#disposables = disposables;
}
[Symbol.asyncDispose]() {
if (this.#disposed) {
return;
}
this.#disposed = true;
// `this.#disposables` ã `using` 夿°ã«å
¥ãã¦ã
// 颿°çµäºæã«èªåçã«ç ´æ£ãããããã«ãã¾ãã
await using disposables = this.#disposables;
// 注: `#socket` 㨠`#channel` ã¯ãä¸ã§å¼ã³åºããã
// `disposables[Symbol.asyncDispose]()` ã«ãã£ã¦ç ´æ£ãããããã
// ããã§è§£æ¾ã§ãã¾ãã
// ãã¹ã¦ã®ãã£ã¹ãã¼ã¶ãã«ã§å¿
é ã§ã¯ããã¾ãããã
// ãããã®ãªãã¸ã§ã¯ãã¯ãã使ç¨ã§ããªããªãããã
// å¾å§æ«ã¨ãã¦é©åã§ãã
this.#socket = undefined;
this.#channel = undefined;
this.#disposables = undefined;
}
}
仿§æ¸
| Specification |
|---|
| ECMAScript Async Explicit Resource Management> # sec-asyncdisposablestack.prototype.move> |