简单的封装,将 interval 二次封装,对外提供暂停、启动功能。
不足之处:interval定时间隔是固定的,在调用异步函数的时候,可能会出现bug。
例如:在调用ajax异步请求过程中,发送a、b两个请求,后台接到a请求需要3秒,接到b只需要1秒,b可能会优先于a执行。
(这种情况,需要用setTimeout()封装,等待前一个ajax完全结束,再启动下一个。业务代码与定时任代码会发生强耦合,暂时不考虑封装)
let Scheduled = function (){ } /** * 循环作业 * @param call 任务 * @param timeout 时间间隔 * @return {{star: star, parse: parse, isRunning: isRunning}} * @constructor */ let CycleWork = function (call, timeout) { let interval = undefined; return { /** * 暂停 * * @returns void */ parse: function () { if (interval !== undefined) { window.clearInterval(interval); interval = undefined; } }, /** * 启动任务 * * @returns void */ star: function () { interval = window.setInterval(call, timeout); }, /** * 是否在跑批中 * * @return {boolean} */ isRunning: function (){ return interval !== undefined; } } } /** * 执行一个循环任务 * * @param call 任务 * @param times 次数 * @param timeout 时间间隔 */ Scheduled.prototype.runCycleWork = function (call, times, timeout) { let n = Math.abs(times); let interval = window.setInterval(() => { if (n === 0) { window.clearInterval(interval); } else { n--; call(); } }, timeout); } Scheduled.prototype.CycleWork = CycleWork; //保证单例,不需要第二个Layers let scheduled = new Scheduled(); export default scheduled;
使用方式:
import Scheduled from '../../components/widget/scheduled' export default { created: function () { let work = new Scheduled.CycleWork(()=>{console.log('test')}, 1000); work.start(); Scheduled.runCycleWork(()=>{console.log('test2')}, 3, 1000); } }
标签:Scheduled,function,interval,js,let,timeout,暂停,call,定时 From: https://www.cnblogs.com/chenss15060100790/p/17039414.html