async-throttle
命名失敗したと思ったのでasync-throttleに改名した
promiseのthrottleとかdebounceするやつなんだけど、そのへんの名前がnpmに空いていなかった
これを
jsimport asyncThrottle from '@shokai/async-throttle'
const delay = msec => new Promise(resolve => setTimeout(resolve, msec))
async function countUp (n = 0) {
for (let i = 0; i < 5; i++) {
console.log(n + i)
await delay(100)
}
}
こうすると
jsconst singleCountUp = asyncThrottle(countUp, {trailing: true})
singleCountUp(0) // run
singleCountUp(10) // skip
singleCountUp(20) // skip
singleCountUp(30) // "sinleCountUp(0)"が終わった後に実行される
skipされた呼び出し元にも、 Promise.resolve
が返る
この仕様はちょっとまだ迷ってる
trailing
オプション
関数を多重呼び出しすると、実行中の関数が終わったら最後の引数を使ってもう1回だけ実行してくれるオプション
skipされた呼び出し元には、最後のおかわり実行の結果が同時に Promsie.resolve
される
callbackをwrapして
Promise化したWebWorkerにガンガンpostMessageしまくってokになる
実行中のWebWorkerにはpostMessageが飛ばなくなる
差分受信毎に compile()
実行しまくって
実行中のWebWorkerにはpostMessageが飛ばないので途中の差分は無視されて
最後の差分を引数にして、最後に1回だけ compile()
実行する
というのが簡単に書ける