UNPKG

requestanimationframe-timer

Version:

setTimeout and setInterval by using requestAnimationFrame

85 lines 2.43 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const raf_1 = __importDefault(require("raf")); var MODE; (function (MODE) { MODE[MODE["MODE_TIMEOUT"] = 0] = "MODE_TIMEOUT"; MODE[MODE["MODE_INTERVAL"] = 1] = "MODE_INTERVAL"; })(MODE || (MODE = {})); const fnMap = new Map(); const executionSet = new Set(); let rafStarted = false; let startId = 0; function getTimeStamp() { return new Date().getTime(); } function executeFn(value) { const { fn, args } = value; fn(...args); } function runFunction() { if (executionSet.size === 0) return; executionSet.forEach(executeFn); executionSet.clear(); } const checkTick = (currentTimeTick) => (value, id) => { const { nextTick, ms, mode } = value; if (currentTimeTick - nextTick >= 0) { executionSet.add(value); if (mode === MODE.MODE_TIMEOUT) { fnMap.delete(id); } else { fnMap.set(id, Object.assign(Object.assign({}, value), { nextTick: nextTick + ms })); } } }; function loop() { if (fnMap.size === 0) { rafStarted = false; return; } const currentTimeTick = getTimeStamp(); fnMap.forEach(checkTick(currentTimeTick)); runFunction(); if (fnMap.size === 0) { rafStarted = false; return; } raf_1.default(loop); } function addId({ fn, ms, args, mode }) { if (!fn) return null; const currentId = startId; fnMap.set(currentId, { fn, ms, nextTick: getTimeStamp() + ms, args, mode, }); if (!rafStarted) { rafStarted = true; raf_1.default(loop); } startId += 1; return currentId; } function removeId(id) { if (id == null) return; if (fnMap.has(id)) { fnMap.delete(id); } } exports.setTimeout = (fn, ms = 0, ...args) => addId({ fn, ms, args, mode: MODE.MODE_TIMEOUT }); exports.clearTimeout = removeId; exports.setInterval = (fn, ms = 0, ...args) => addId({ fn, ms, args, mode: MODE.MODE_INTERVAL }); exports.clearInterval = removeId; exports.default = { setTimeout: exports.setTimeout, clearTimeout: exports.clearTimeout, setInterval: exports.setInterval, clearInterval: exports.clearInterval }; //# sourceMappingURL=index.js.map