getPromiseSettledAnytimes
何回でもresolveできるPromiseを作る函数
code:mod.ts
export 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) {...}で呼び出せば同じことを実現できるんじゃないか?
code:ts
const 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);
というか、async-awaitでeventを同期的に書いてみるで採用されている方法がそもそもこれだったのか
一周回って戻ってきた
#2021-11-03 17:47:29 as constが抜けてた
#2021-10-21 13:41:36 default型引数、例を追加
#2021-10-18 12:36:55 fulfilledじゃなくてsettledだった
#2021-10-17 22:15:41