andyfleming / interval-promise

setInterval with setTimeout semantics for promises and async/await
MIT License
107 stars 16 forks source link

Interval Promise

NPM Version Build Status Coverage Status

Overview

This library provides a simple mechanism for running a promise with a given amount of time between executions.

Standard Javascript » setInterval()

traditional interval

interval-promise » interval()

interval promise

Installation

npm install interval-promise

Usage

Simple example using async-await

const interval = require('interval-promise')

// Run a function 10 times with 1 second between each iteration
interval(async () => {
    await someOtherPromiseReturningFunction()
    await another()
}, 1000, {iterations: 10})

API

interval(func, intervalLength, options = {}) // returns Promise<undefined>

Arguments

Argument Attritubes Description
func function Required
Function to execute for each interval. MUST return a promise.

Two arguments are passed to this function.
  • iterationNumber number — The iteration number (starting at 1)
  • stop function — used to "stop" (skipping all remaining iterations)
intervalLength number | function Required
Length in ms to wait between iterations. Should be (or return) a non-negative integer.

If a function is used, one parameter iterationNumber (starting at 1) is passed.
options object Optional settings (detailed below).
options.iterations number Default: Infinity
The number of times to execute the function. Must be Infinity or an integer greater than 0.
options.stopOnError boolean Default: true
If true, no subsequent calls will be made. The promise returned by interval() will be rejected and pass through the error thrown.

Project Values

Acknowledgements

This library was inspired by reissue.

FAQ

How can I stop the interval from outside the interval function?

There isn't currently direct feature to stop the iterations externally. You can, however, achieve this by checking a variable in the parent scope (of where the function is defined). Check out the code below.

const interval = require('interval-promise')

let stoppedExternally = false
const stopExternally = () => { stoppedExternally = true }

interval(async (iteration, stop) => {

    if (stoppedExternally) {
        stop()
    }

    // ... normal functionality ...

}, 1000)

// Some other work...
someOtherWork().then(() => {

    // Now that our "other work" is done, we can stop our interval above with:
    stopExternally()

})