UNPKG

set-promise-interval

Version:

用于定时执行异步任务,调用方式类似原生 setInterval

41 lines (40 loc) 1.23 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const runningTasks = new Set(); const runningHandlers = new Map(); let id = 0; function delay(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } async function run(id, ...[handler, interval = 0]) { while (runningTasks.has(id)) { const startTime = new Date().getTime(); runningHandlers.set(id, handler()); try { await runningHandlers.get(id); } catch (e) { throw e; } finally { runningHandlers.delete(id); } await delay(interval - new Date().getTime() + startTime); } } async function clearPromiseInterval(intervalId) { if (typeof intervalId === 'number' && runningTasks.has(intervalId)) { if (runningHandlers.has(intervalId)) { await runningHandlers.get(intervalId); } runningTasks.delete(intervalId); } } exports.clearPromiseInterval = clearPromiseInterval; function setPromiseInterval(handler, interval) { id += 1; runningTasks.add(id); run(id, handler, interval); return id; } exports.default = setPromiseInterval;