/** ***************************************** * Created by edonet@163.com * Created on 2021-03-21 18:01:35 ***************************************** */ 'use strict'; /** ***************************************** * 加载依赖 ***************************************** */ import { setTimer } from './delay'; /** ***************************************** * 设置延时 ***************************************** */ function delay(time: number, callback: () => void | boolean): () => void { let cb: (() => void) | void; // 设置延时 cb = setTimer(time, function invoke() { // 执行回调 if (callback() !== false && cb) { return cb = setTimer(time, invoke); } // 清空取消函数 cb = undefined; }); // 返回取消函数 return () => { if (cb) { cb = cb(); } }; } /** ***************************************** * 定时器 ***************************************** */ function interval(time: number, callback: () => void | boolean): () => void; function interval(callback: () => void | boolean): () => void; function interval(callback: () => void | boolean, time: number): () => void; function interval(time: unknown, callback?: unknown): () => void { // 重载参数 if (typeof time === 'function') { return delay(callback as number, time as () => void); } // 校验参数 if (typeof callback !== 'function') { throw new Error('`callback` expected a Function'); } // 设置计时器 return delay(time as number, callback as () => void); } /** ***************************************** * 抛出接口 ***************************************** */ export { interval };