Provides functions for setting intervals that correct themselves in different ways.
Supports both CJS and ES6 import style.
// CommonJS-style
const {setAbsoluteInterval, setRelativeInterval, clearCustomInterval} = require("accurate-intervals");
// ES6 module-style
import {setAbsoluteInterval, setRelativeInterval, clearCustomInterval} from "accurate-intervals";
npm i accurate-intervals
setAbsoluteInterval((delay)=>{
console.log(`(${Date.now()}: Fired after ${delay} milliseconds.`);
}, 1000)
If Date.now()
returns 123###
, setting an absolute interval that fires every 1000
milliseconds should be expected to fire at 124000
, 125000
, 126000
, 127000
, etc...
The first time the interval fires, the delay can vary wildly.
- If you set it at
999999
, it will want to fire after1
millisecond. - If you set it at
111111
, it will want to fire after889
milliseconds.
setRelativeInterval((delay)=>{
console.log(`(${Date.now()}: Fired after ${delay} milliseconds.`);
}, 1000)
If Date.now()
returns 123###
, setting a relative interval that fires every 1000
milliseconds should be expected to fire at 124###
, 125###
, 126###
, 127###
, etc...
Due to inherent unpredictability in the way intervals and timeouts work, the time between firing will vary, but it will always be between 0ms
~1000
ms (in this example). In my experience, you can expect it to vary by 0ms
~25ms
on average regardless of the actual interval assigned, with some spikes of 100ms
~ or more uncommonly.
Setting an interval below 30ms
is inadvisable in pretty much all circumstances, as you may create a runaway condition where your interval will have to endlessly try to catch up. In order to avoid this scenario, these interval functions automatically skip cycles that are trying to catch up.
const intervalID = setRelativeInterval((delay)=>{
clearCustomInterval(intervalID);
console.log("only fires once");
}, 1000);
clearCustomInterval
clears intervals set by both setRelativeInterval
and setAbsoluteInterval
.