5. leading & trailingをサポートするthrottle() を実装する
シェアしよう
少し工夫が必要 - accepted / - tried
4. throttle()を実装するの続きです、まずそちらを読んで完成してください。
この問題では、さら増強したthrottle()
の実装が求めまれます。throttle()
に第三引数option: {leading: boolean, trailing: boolean}
をうけるようにしてください。
- leading: すぐ実行する
- trailing: クーリング終わったら実行する
4. throttle()を実装するで求められるのは{leading: true, trailing: true}
のケースです。
説明
同じく3ユニットのスロットルを持って説明する。
─ A ─ B ─ C ─ ─ D ─ ─ ─ ─ ─ ─ E ─ ─ F ─ G
{leading: true, trailing: true}
でthrottleするとこうなる
─ A ─ ─ ─ C ─ ─ ─ D ─ ─ ─ ─ E ─ ─ ─ G
{leading: false, trailing: true}
の場合は、 A と E がスキップされる
─ ─ ─ ─ C ─ ─ ─ D ─ ─ ─ ─ ─ ─ ─ G
{leading: true, trailing: false}
では、A D E だけ残る
─ A ─ ─ ─ ─ D ─ ─ ─ ─ ─ ─ E
{leading: false, trailing: false}
の場合は、もちろん、全部スキップされる
補足
- 上記のスペックに従ってください。
lodash.throttle()
と完全に一緒ではありません。 window.setTimeout
とwindow.clearTimeout
は精確ではないから、入力したコードをジャッジするときに、他の実装に入れ替えられます。interfaceが一緒にで、気にしなくて良い。
概ね以下のようにジャッジされます。
let currentTime = 0const run = (input) => { currentTime = 0 const calls = [] const func = (arg) => { calls.push(`${arg}@${currentTime}`) } const throttled = throttle(func, 3) input.forEach((call) => { const [arg, time] = call.split('@') setTimeout(() => throttled(arg), time) }) return calls}expect(run(['A@0', 'B@2', 'C@3'])).toEqual(['A@0', 'C@3'])