83. intervalを作る
シェアしよう
少し工夫が必要 - accepted / - tried
mySetInterval(a, b)
を実装してください。window.setInterval()
と違って、間隔が固定ではなくどんどん長くなっていく、間隔はこう計算すると良い → period = a + b * count
。
let prev = Date.now()
const func = () => {
const now = Date.now()
console.log('roughly ', Date.now() - prev)
prev = now
}
const id = mySetInterval(func, 100, 200)
// 概ね100、100 + 200 * 0
// 概ね400、100 + 200 * 1
// 概ね900、100 + 200 * 2
// 概ね1600、100 + 200 * 3
// ....
myClearInterval(id) // intervalを止める
mySetInterval(delay, period)
のdelay
は1回目に使われ、その後period
は重なっていく。window.setTimeoutと window.clearTimeoutは精確ではないから、入力したコードをジャッジするときに、他の実装に入れ替えられます。interfaceが一緒にで、気にしなくて良い。
概ね以下のようにジャッジされます。(参考だけで、把握しなくても良い)
let currentTime = 0
const run = (delay, period, clearAt) => {
currentTime = 0
pipeline.length = 0
const logs = []
const func = () => {
logs.push(currentTime)
}
mySetInterval(func, delay, period)
if (clearAt !== undefined) {
setTimeout(() => {
myClearInterval(id)
}, clearAt)
}
while (pipeline.length > 0 && calls.length < 5) {
const [time, callback] = pipeline.shift()
currentTime = time
callback()
}
return calls
}
expect(run(100, 200)).toEqual([100,400,900,1600,2500])
expect(run(100, 200, 450)).toEqual([100,400])
expect(run(100, 200, 50)).toEqual([])