84. fake timer (setInterval)を実装する
シェアしよう
少し工夫が必要 - accepted / - tried
この問題は36. fake timer(setTimeout)を実装するの続きです。
setTimeout
と同じく、setInterval
も精確ではない。(詳しくはEvent Loop で)。
ほとんどの場合はこれが問題にならないが、テストする時などではちょっと困る。
Event Loopの問題なく、精確なsetInterval()和clearInterval()を作ってくだい。これもFakeTimes がやっていることです。
「精確」というのは、関数の実行時間を0とし、時間は0からスタートすると、setInterval(func1, 100)ではfunc1が必ず以下の時間に実行される: 100、200、300 ...
Date.now()
の実装も入れ替える必要がある。
class FakeTimer { install() { // replace window.setInterval, window.clearInterval, Date.now // with your implementation } uninstall() { // restore the original implementation of // window.setInterval, window.clearInterval, Date.now } tick() { // run the scheduled functions without waiting }}
** 無限ループのご注意ください。** コードは大体こんな感じにジャッジされる。
const fakeTimer = new FakeTimer()fakeTimer.install()const logs = []const log = () => { logs.push(Date.now())}let count = 0const id = setInterval(() => { if (count > 1) { clearInterval(id) } else { log() } count += 1}, 100)// log 'A' at every 100, stop at 200fakeTimer.tick()fakeTimer.uninstall() expect(logs).toEqual([100,200])
補足
時間に関係する関数の中ではDate.now()だけ対応が必要、その他は無視して良い。