modern-api.timer
v0.2.0-beta.2
Published
Timer APIs based on Promise, setTimeout, setInterval
Downloads
13
Maintainers
Readme
modern-api.timer
Timer APIs based on Promise
, setTimeout
, setInterval
Install
$ npm i modern-api.timer
Usage
sleep for n ms
import { sleep } from 'modern-api.timer'
(async() => {
const now = +new Date()
await sleep(1000)
console.log(+new Date() - now) // 1000
})()
timeout over n ms
import { sleep, timeout } from 'modern-api.timer'
(async() => {
await timeout(sleep(1000), 2000) // no error
await timeout(sleep(1000), 500) // reject error: 'timeout over 500ms'
})()
pasue and resume setTimeout
import { pauseTimeout } from 'modern-api.timer'
(async () => {
const timer = pauseTimeout(() => console.log('done'), 1000) // timer.isActive = true
await sleep(500)
timer.pause() // pause timing, timer.isActive = false
await sleep(500) // log nothing
timer.resume() // resume timing, timer.isActive = true
await sleep(500) // log 'done'
})()
stop setTimeout
whenever you don't want to continue
import { pauseTimeout } from 'modern-api.timer'
(async () => {
const timer = pauseTimeout(() => console.log('done'), 1000) // timer.isActive = true
await sleep(500)
timer.stop() // stop timing, timer.isActive = false
await sleep(500) // log nothing
timer.resume() // resume not work after stopping, timer.isActive = false
await sleep(500) // log nothing
})()
pasue and resume setInterval
import { pauseInterval } from 'modern-api.timer'
(async () => {
const timer = pauseInterval(() => console.log('tick'), 1000) // timer.isActive = true
await sleep(500)
timer.pause() // pause polling, timer.isActive = false
await sleep(500) // log nothing
timer.resume() // resume polling, timer.isActive = true
await sleep(1000) // log 'tick', timer.isActive = true
await sleep(1000) // log 'tick', timer.isActive = true
})()
stop setInterval
whenever you don't want to continue
import { pauseInterval } from 'modern-api.timer'
(async () => {
const timer = pauseInterval(() => console.log('tick'), 1000) // timer.isActive = true
await sleep(500)
timer.stop() // stop polling, timer.isActive = false
await sleep(500) // log nothing
timer.resume() // resume not work after stopping, timer.isActive = false
await sleep(1000) // log nothing
await sleep(1000) // log nothing
})()
API
/**
* sleep for n ms
*
* @param {number} delay - sleep delay, ms
* @returns {Promise<void>}
*/
declare const sleep: (delay: number) => Promise<unknown>;
/**
* reject if Promise timeout, otherwise return Promise result
*
* @template {T} = Promise return value type
* @param {PromiseLike<T>} value - Promise instance
* @param {number} delay - timeout limit
* @param {Error} error - timeout error, default new Error(`timeout over ${delay}ms`)
* @returns {Promise<T>}
*/
declare const timeout: <T>(value: PromiseLike<T>, delay: number, error?: Error) => Promise<unknown>;
/**
* pausable `setTimeout`
*
* @typedef {Object} Timer
* @property {boolean} isActive - whether `setTimeout` is timing
* @property {() => void} pause - `setTimeout` stop timing temporarily
* @property {() => void} resume - `setTimeout` continue timing
* @property {() => void} stop - `setTimeout` stop timing permanently
*
* @param {() => any} callback - `setTimeout` callback
* @param {number} delay - `setTimeout` delay, ms
* @returns {Timer}
*/
declare const pauseTimeout: (callback: () => any, delay: number) => {
isActive: boolean;
pause: () => void;
resume: () => void;
stop: () => void;
};
/**
* pausable and safer `setInterval` \
* - more flexible \
* - make sure callback invoke execute in order \
* - make sure no callback invoke missed \
* - make sure callback invoke frequency as stable as possible
*
* @typedef {Object} Timer
* @property {boolean} isActive - whether `setInterval` is polling
* @property {() => void} pause - `setInterval` stop polling temporarily
* @property {() => void} resume - `setInterval` continue polling
* @property {() => void} stop - `setInterval` stop polling permanently
*
* @param {() => any} callback - `setInterval` callback
* @param {number} delay - `setInterval` delay, ms
* @returns {Timer}
*/
declare const pauseInterval: (callback: () => any, delay: number) => {
isActive: boolean;
pause: () => void;
resume: () => void;
stop: () => void;
};