Package Exports
- dynamic-interval
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (dynamic-interval) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
dynamic-interval
🕐 The dynamic setInterval
setInterval with the ability to specify a new interval duration on each tick.
Also referred to as a "dynterval".
Sections
Install
npm install dynamic-intervalUsage
import setDynterval from 'dynamic-interval'
const dynterval = setDynterval(ctx => console.log('tick!', ctx), 100)Examples
Basic
This script doubles the duration of the interval on each iteration, starting with 50ms:
import setDynterval from 'dynamic-interval'
// you can attach arbitrary properties to this object (in this case, `rate`), but
// `wait` is what's used to determine the duration between each interval
const config = { wait: 50, rate: 2 }
const dynterval = setDynterval(context => {
console.log('interval', context)
const next = context.wait * context.rate
return { ...context, wait: next }
}, config)
// interval { wait: 50, rate: 2 }
// interval { wait: 100, rate: 2 }
// interval { wait: 200, rate: 2 }
// ...
// clear out the interval after 2 seconds
// NOTE: `window.clearInterval` is not compatible! use the `clear` method instead
setTimeout(() => {
dynterval.clear()
}, 2000)Advanced
This script calculates the amount of drift on each step and corrects for it during the subsequent step.
It uses a custom interval api. In this case, we're using worker-timers.
import setDynterval from 'dynamic-interval'
import * as workerTimers from 'worker-timers'
const setAccurateInterval = (func, wait) => {
let expected = Date.now() + wait
return setDynterval(context => {
const drift = Date.now() - expected
if (drift > wait)
throw Error(`that drift be crazy: ${drift}`)
expected += wait
const next = Math.max(0, wait - drift)
func(context)
return { ...context, drift, wait: next }
}, wait, workerTimers)
}
setAccurateInterval(context => console.log('tick', context), 1000)Interface
setDynterval(<action>, <wait|config>, <api>)
action
The callback to invoke on each interval tick
- Type:
Function - Required
wait
Specifies the duration of each interval (i.e. the amount of time to wait between each tick)
- Type:
Number
config
Specifies the configuration of the interval. Passed into the action function as context.
Type:
ObjectProperties:
waitSpecifies the duration of each interval
- Type:
Number
- Type:
immediateDetermines if the interval should start immediately or wait one interval before starting
- Type:
Boolean - Default:
false
- Type:
api
A custom interval api may be provided. It must define functions for both setInterval and clearInterval.
Type:
ObjectProperties:
setTimeoutDefines how to create a new timeout
- Type:
Function - Signature:
setTimeout(func: Function, delay: Number) - Returns:
TimeoutID - Default:
WindowOrWorkerGlobalScope.setTimeout
- Type:
clearTimeoutDefines how to clear or cancel a timeout
- Type:
Function - Signature:
clearTimeout(id: TimeoutID) - Returns:
void - Default:
WindowOrWorkerGlobalScope.clearTimeout
- Type:
setIntervalDefines how to create a new interval
- Type:
Function - Signature:
setInterval(func: Function, delay: Number) - Returns:
IntervalID - Default:
WindowOrWorkerGlobalScope.setInterval
- Type:
clearIntervalDefines how to clear or cancel an interval
- Type:
Function - Signature:
clearInterval(id: IntervalID) - Returns:
void - Default:
WindowOrWorkerGlobalScope.clearInterval
- Type:
Related
stateful-dynamic-intervaladds pause, resume and grouping functionality todynamic-interval.accurate-intervalan interval that automatically corrects for local drift on each tick. May be provided as anapi.audio-context-timersan interval that uses the Web Audio API clock. May be provided as anapi.worker-timersan interval that uses Service Workers as a backend. May be provided as anapi.
License
MIT