setInterval叠加订阅需求:启动、重置后新增订阅而非清除重置
实现带叠加订阅的setInterval控制方案
Hey 伙计!咱们一步步来实现你要的功能:先启动、重置、重启主setInterval,然后以+1、+2、+3的间隔新增订阅,而且这些订阅只叠加、不清除也不重置。
第一步:搞定主定时器的启动/重置/重启
首先,咱们得存住主定时器的ID,这样重置的时候才能精准清除它。下面是基础的实现代码:
// 存储主定时器的ID,用来后续重置 let mainTimerId = null; // 主定时器的基础间隔(比如1000毫秒,你可以按需调整) const baseDelay = 1000; function startMainTimer() { // 如果已经有正在运行的主定时器,先清除(这就是重置逻辑) if (mainTimerId) { clearInterval(mainTimerId); } // 启动新的主定时器 mainTimerId = setInterval(() => { console.log('主定时器正在运行...'); // 这里放你原本要执行的核心逻辑 }, baseDelay); } // 调用示例:启动 → 重置(重新调用start即可)→ 再次启动 startMainTimer(); // 第一次启动主定时器 setTimeout(() => startMainTimer(), 5000); // 5秒后重置并重启 setTimeout(() => startMainTimer(), 10000); // 10秒后再次重置重启
第二步:添加叠加式递增订阅
接下来是关键的叠加订阅部分——咱们用一个数组来存所有新增的定时器ID,这样就不会弄丢它们,而且每次新增的间隔是基础间隔 + n*1000(n从1开始,对应+1、+2、+3秒),绝对不会清除之前的任何定时器:
// 存储所有叠加的定时器ID const stackedTimers = []; // 记录当前叠加的次数,用来计算间隔增量 let stackCounter = 0; function addStackedSubscription() { stackCounter++; // 每次叠加的间隔 = 基础间隔 + 叠加次数*1000ms(也就是+1、+2、+3秒) const stackedDelay = baseDelay + stackCounter * 1000; const timerId = setInterval(() => { console.log(`叠加订阅${stackCounter}运行中(间隔:${stackedDelay}ms)`); // 这里放对应叠加订阅要执行的逻辑 }, stackedDelay); stackedTimers.push(timerId); } // 调用示例:等主定时器稳定后,逐步添加叠加订阅 setTimeout(() => { addStackedSubscription(); // 第一个叠加订阅,间隔+1秒 setTimeout(() => addStackedSubscription(), 2000); // 2秒后加第二个,间隔+2秒 setTimeout(() => addStackedSubscription(), 4000); // 再4秒后加第三个,间隔+3秒 }, 12000); // 等主定时器第二次重启后2秒开始叠加
几个重要的注意点
- 主定时器的重置:每次调用
startMainTimer()都会先清掉之前的主定时器,再启动新的,完美实现“重置”效果。 - 叠加不清除:所有新增的订阅都存在
stackedTimers数组里,咱们不会主动清除它们。如果后续需要清理(比如页面卸载时),可以用这个函数:// 可选:清理所有定时器(比如页面关闭前调用) function clearAllTimers() { if (mainTimerId) clearInterval(mainTimerId); stackedTimers.forEach(id => clearInterval(id)); mainTimerId = null; stackedTimers.length = 0; stackCounter = 0; } - 自定义增量逻辑:如果你的“+1、+2、+3”不是秒数,而是其他单位或者规则,只需要修改
stackedDelay的计算方式就行,灵活得很。
这样整个流程就完全匹配你的需求啦:主定时器先启动、重置、重启,然后逐步叠加不同间隔的订阅,所有叠加的都保留着,不会被清除或重置。
内容的提问来源于stack exchange,提问作者Orhan Gazi
相关产品推荐
相关产品推荐

