Advanced Timer Techniques in Frontend Development
This article examines the challenges of timer precision in front‑end scenarios such as e‑commerce flash sales, explains the limitations of native setInterval and setTimeout, and introduces a frame‑based timer using requestAnimationFrame, requestIdleCallback and compensation strategies to achieve high‑accuracy scheduling.
Background
In front‑end business, many features require timing, such as stay‑time tracking, countdowns for flash sales, and animation effects. These scenarios are especially common in e‑commerce and gaming.
Timer Applications in E‑commerce Platforms
Flash‑sale pages need to display remaining time for ongoing events and the start time for upcoming events. Accuracy is critical because a small timing error can cause users to miss a purchase.
Other tasks like “stay‑time for reward” have low precision requirements.
Common Timer Solutions
setInterval
setInterval repeats a callback at a fixed delay. Example code:
function update() { ... };
setInterval(() => { update(); }, 1000);In extreme cases where the callback takes longer than the interval, callbacks can pile up, causing consecutive executions and timing drift.
Chained setTimeout
Chaining setTimeout can emulate setInterval while avoiding overlap:
let myInterval = (func, delay) => {
setTimeout(() => {
func();
myInterval(func, delay);
}, delay);
};Problems in High‑Complexity Timing
Timing Compensation
When timers must fire on exact seconds, compensation calculations align the next tick with the next full second.
const now = Date.now();
const nextFullSecond = Math.floor(now / 1000 + 1) * 1000;
const fixTime = nextFullSecond - now;
function update() { ... };
function startInterval() {
setInterval(() => { update(); }, 1000);
}
setTimeout(startInterval, fixTime);Interval Exceeding Threshold
Chrome’s maximum delay is 2,147,483,647 ms; exceeding it causes the timer to fire immediately.
Redundant Calculations and Frame Drops
When many re‑renders occur within a single 60 Hz frame, only the last one is displayed, and excessive work can cause frame‑drops.
A Frame‑Based Timer Alternative
Browser Rendering Pipeline
Each frame goes through stages: frame start, input handling, requestAnimationFrame callbacks, HTML parsing, style recalc, layout, layer update, paint, compositing, idle callbacks, and frame end.
requestAnimationFrame
Executed before the browser paints, synchronized with the refresh rate, ideal for animation and precise timing.
requestIdleCallback
Runs after painting when the main thread is idle; useful for low‑priority work but experimental.
Timer Design Philosophy
The custom timer registers callbacks in a priority queue checked each frame, similar to the event‑loop but driven by the rendering loop.
const pollTimerTask = (time) => {
if (timerQueue.length === 0) return;
while (timerQueue[0] && time >= timerQueue[0].time) {
const timer = timerQueue.shift();
while (timer.tickerQueue.length) {
const { id, callback, delay, loop, defer } = timer.tickerQueue.shift();
callback(time);
if (loop && idPool[id].exist) {
let nextTime = timer.time + delay;
if (time - nextTime > delay) {
nextTime = nextTime + Math.floor((time - nextTime) / delay) * delay;
defer && (nextTime += delay);
}
registerTimerWithId({ id, callback, time: nextTime, delay, loop, defer });
} else {
delete idPool[id];
}
}
}
};API Usage
Two APIs are provided:
register(callback: Function): number – registers a tick synchronized with the frame rate.
setTimer(options: TimerConfig): number – flexible timer with startTime, loop, delay, immediate, fix, defer options.
Examples demonstrate basic, looping, and fixed‑time behavior.
Conclusion
Native timers are suitable for low‑precision needs, while the frame‑based timer offers higher accuracy at the cost of learning overhead. Choosing the right timer depends on the specific business scenario.
58 Tech
Official tech channel of 58, a platform for tech innovation, sharing, and communication.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.