5. leading & trailingをサポートするthrottle() を実装する

JavaScriptLodash
お役に立つのか?

少し工夫が必要  - accepted / - tried

4. throttle()を実装するの続きです、まずそちらを読んで完成してください。

この問題では、さら増強したthrottle()の実装が求めまれます。throttle()に第三引数option: {leading: boolean, trailing: boolean}をうけるようにしてください。

  1. leading: すぐ実行する
  2. 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}の場合は、もちろん、全部スキップされる

補足

  1. 上記のスペックに従ってください。 lodash.throttle()と完全に一緒ではありません。
  2. window.setTimeoutwindow.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'])

30分間以内で解いてみて

ディスカス(22)