generated at
async-throttle

命名失敗したと思ったのでasync-throttleに改名した
promiseのthrottleとかdebounceするやつなんだけど、そのへんの名前がnpmに空いていなかった


async-awaitPromiseの多重呼び出しを避けたくて作ったshokai

これを
js
import 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) } }

こうすると
js
const 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 される


特に検索や推薦をWebWorkerでやるのに相性がいい
callbackをwrapしてPromise化したWebWorkerにガンガンpostMessageしまくってokになる
実行中のWebWorkerにはpostMessageが飛ばなくなる
差分受信毎に compile() 実行しまくって
実行中のWebWorkerにはpostMessageが飛ばないので途中の差分は無視されて
最後の差分を引数にして、最後に1回だけ compile() 実行する
というのが簡単に書ける