getPromiseSettledAnytimes
mod.tsexport function getPromiseSettledAnytimes<T, E = unknown>() {
let _resolve: ((value: T) => void) | undefined;
let _reject: ((value: E) => void) | undefined;
const waitForSettled = () => new Promise<T>(
(res, rej) => {
_resolve = res;
_reject = rej;
},
);
const resolve = (value: T) => _resolve?.(value);
const reject = (reason: E) => _reject?.(reason);
return [waitForSettled, resolve, reject] as const;
}
Async Generatorを使わずとも、これでevent listenerをwrapして
while(true) {...}
で呼び出せば同じことを実現できるんじゃないか?
tsconst [waitMove, resolve] = getPromiseSettledAnytimes<MouseEvent>();
addEventListener("mousemove", resolve);
addEventListener("mouseup", resolve);
while (true) {
const moveEvent = await waitMove();
if (moveEvent.type === "mouseup") break;
// ...
}
removeEventListener("mousemove", resolve);
removeEventListener("mouseup", resolve);
一周回って戻ってきた