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 = 0
const 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'])