UNPKG

delayable-setinterval

Version:

An asynchronous setInterval that can be delayed using promises

62 lines (61 loc) 1.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.setDelayedInterval = exports.clearDelayedInterval = void 0; const __intervals = {}; function clearDelayedInterval(intervalID) { if (!intervalID || !__intervals[intervalID]) { return; } clearTimeout(__intervals[intervalID].timer); __intervals[intervalID].timer = null; delete __intervals[intervalID]; } exports.clearDelayedInterval = clearDelayedInterval; function generateID() { return `${Date.now()}:${Math.floor(Math.random() * 1000000)}`; } function restartTimer(id) { const interval = __intervals[id]; if (!interval) { throw new Error(`No interval found for ID: ${id}`); } if (interval.timer !== null) { throw new Error(`Interval already running on ID: ${id}`); } interval.timer = setTimeout(() => { if (!interval.timer) { // Stop if timer has been cleared return; } let result; try { result = interval.fn(); } catch (err) { } if (result && typeof result.then === "function") { const taskComplete = () => { if (!interval.timer) { // Stop if timer has been cleared return; } interval.timer = null; restartTimer(id); }; result.then(taskComplete, taskComplete); return; } interval.timer = null; restartTimer(id); }, interval.delay); } function setDelayedInterval(fn, delay) { const id = generateID(); __intervals[id] = { delay, fn, timer: null }; restartTimer(id); return id; } exports.setDelayedInterval = setDelayedInterval;