Awesome Open Source
Awesome Open Source


🕐 The dynamic setInterval

build npm

setInterval with the ability to specify a new interval duration on each tick.

Also referred to as a "dynterval".



npm install dynamic-interval


import setDynterval from 'dynamic-interval'

const action = context => console.log('tick!', context)
const wait = 100

const dynterval = setDynterval(action, wait)

// tick! { wait: 100 }



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(() => {
}, 2000)


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 = + wait

  return setDynterval(context => {
    const drift = - expected

    if (drift > wait)
      throw Error(`that drift be crazy: ${drift}`)

    expected += wait

    const next = Math.max(0, wait - drift)


    return { ...context, drift, wait: next }
  }, wait, workerTimers)

setAccurateInterval(context => console.log('tick', context), 1000)


setDynterval(<action>, <wait|config>, <api>)


The callback to invoke on each interval tick

  • Type: Function
  • Required


Specifies the duration of each interval (i.e. the amount of time to wait between each tick)

  • Type: Number


Specifies the configuration of the interval. Passed into the action function as context.

  • Type: Object

  • Properties:

    • wait

      Specifies the duration of each interval

      • Type: Number
    • immediate

      Determines if the interval should start immediately or wait one interval before starting

      • Type: Boolean
      • Default: false


A custom interval api may be provided. It must define functions for either setInterval and clearInterval or setTimeout and clearTimeout.


  • stateful-dynamic-interval adds pause, resume and grouping functionality to dynamic-interval.
  • accurate-interval an interval that automatically corrects for local drift on each tick. May be provided as an api.
  • audio-context-timers an interval that uses the Web Audio API clock. May be provided as an api.
  • worker-timers an interval that uses Service Workers as a backend. May be provided as an api.



Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
Javascript (1,552,287
Time (1,443
Clock (809
Interval (215
Iteration (161
Related Projects