はじめに
TypeScriptを書いていてキャンセル可能なsetTimeOut関数が欲しいなと思ったので書きました。もっといい書き方があれば教えていただきたいです!!
実装
他にもいくつか方法はあると思いますが、今回は引数に遅延時間(duration)とコールバック関数を渡すと、実行開始の関数とキャンセル用の関数が帰ってくるような仕組みにしました。
const disposableTimeOut = (duration: number, callback: () => void): {
on: () => Promise<void>,
dispose: () => void,
} => {
let timeOutId: NodeJS.Timeout | null;
let resolve: () => void
const on = () => new Promise<void>((_resolve) => {
resolve = _resolve;
timeOutId = setTimeout(() => {
callback();
timeOutId = null;
resolve();
}, duration)
})
const dispose = () => {
if (timeOutId) {
clearTimeout(timeOutId);
timeOutId = null;
resolve();
}
}
return {
on,
dispose,
}
}
使用例
const disposable = disposableTimeOut(1000, () => {
console.log('1秒たったよ!! ワイワイ!!')
}
// タイムアウトしたい関数を実行する
await disposable.on();
// キャンセルしたいところでキャンセル(破棄)する
disposable.dispose();
さいごに
↑みたいな感じで動きます!!