setInterval“跳闸"本身并启动第二个间隔计时器 [英] setInterval 'tripping' itself and starting a 2nd interval timer
问题描述
我编写了一个选项卡功能,可以在一段时间后在选项卡之间切换,这看起来很完美,但是我注意到它有时会中断.
在查看 setInterval
并查看错误本身后,它看起来像 setInterval
20-30 分钟后,自身跳闸并启动第二个计时器.这会导致同时显示 2 个标签.
我在网上阅读了一些内容,基本上它与单线程的 Javascript 相关,这只是 setInterval
的一个基本缺陷,如果它跳闸,它不会重置它只是创建的计时器第二个.无论如何要为此行程添加错误捕获或运行重复超时功能的更好方法?
jQuery(document).ready(function() {功能 autoPlayTabs(tabTitle1, tabTitle2, tabTitle3, tabTitle4, tabContent1, tabContent2, tabContent3, tabContent4, tabLength, tabTitleMobile1, tabTitleMobile2, tabTitleMobile3, tabTitleMobile4) {var actualTabLength = tabLength * 4;var tabContainer = jQuery('.elementor-tabs');var allTabs = jQuery('.elementor-tabs .elementor-tabs-wrapper .elementor-tab-title');var allContent = jQuery('.elementor-tabs .elementor-tabs-content-wrapper .elementor-tab-content');var initialTabTimer = null;var tabTimer = null;tabTitle1.addClass('active');tabContent1.addClass('active');console.log('设置initialTabTimer');initialTabTimer = setTimeout(function(){tabTitle1.removeClass('active');tabContent1.removeClass('active');tabTitle2.addClass('active');tabContent2.addClass('active');控制台日志(设置超时2");设置超时(功能(){tabTitle2.removeClass('active');tabContent2.removeClass('active');tabTitle3.addClass('active');tabContent3.addClass('active');控制台日志(设置超时3");设置超时(功能(){tabTitle3.removeClass('active');tabContent3.removeClass('active');tabTitle4.addClass('active');tabContent4.addClass('active');console.log(正在执行 Timeout3 函数");}, tabLength);}, tabLength);}, tabLength);console.log("设置 tabTimer");tabTimer = setInterval(function(){tabTitle4.removeClass('active');tabContent4.removeClass('active');tabTitle1.addClass('active');tabContent1.addClass('active');控制台日志(设置超时B");设置超时(功能(){tabTitle1.removeClass('active');tabContent1.removeClass('active');tabTitle2.addClass('active');tabContent2.addClass('active');控制台日志(设置超时C");设置超时(功能(){tabTitle2.removeClass('active');tabContent2.removeClass('active');tabTitle3.addClass('active');tabContent3.addClass('active');控制台日志(设置超时D");设置超时(功能(){tabTitle3.removeClass('active');tabContent3.removeClass('active');tabTitle4.addClass('active');tabContent4.addClass('active');console.log(正在执行 TimeoutD 函数");}, tabLength);}, tabLength);}, tabLength);}, 实际标签长度);allTabs.click(function() {if (initialTabTimer !== null) {clearTimeout(initialTabTimer);initialTabTimer = null;console.log(已清除 initialTabTimer");}if (tabTimer !== null) {clearInterval(tabTimer);tabTimer = null;console.log(已清除 tabTimer");} 别的 {console.log(不需要清除tabTimer");}allTabs.removeClass('active');allContent.removeClass('active');tabContainer.addClass('tabsManual');});}if(homeTabTitle1.length > 0){console.log(调用 AutoPlayTabs 主页");autoPlayTabs(homeTabTitle1,homeTabTitle2,homeTabTitle3,homeTabTitle4,homeTabContent1,homeTabContent2,homeTabContent3,homeTabContent4,homeTabLength);}});
下面是从它工作中调用的每个 setTimeout 的 console.log,以打破自我修复:
调用 AutoPlayTabs 主页设置initialTabTimer设置 tabTimer设置超时2设置超时3执行 Timeout3 函数//这个console.log块运行了30次没有错误//设置超时B设置超时C设置超时D执行 TimeoutD 函数//这个console.log块运行了30次没有错误////它在总共 24 分钟后在这里中断//设置超时B设置超时C设置超时DSetting TimeoutB//由于某种原因 TimeoutB 再次被触发执行 TimeoutD 函数设置超时C设置超时D设置超时B执行 TimeoutD 函数设置超时C设置超时D执行 TimeoutD 函数//它在 2.4 分钟后固定在这里//设置超时B设置超时C设置超时D执行 TimeoutD 函数
如果您只是将逻辑简化为只运行一个间隔,那么所有同步问题都会迎刃而解
const tabs = [{标题:tabTitle1,内容:tabContent1},{标题:tabTitle2,内容:tabContent2},{标题:tabTitle3,内容:tabContent3},{标题:tabTitle4,内容:tabContent4}];让当前 = 0;让 tab = tabs[curr];tab.title.addClass(活动");tab.content.addClass(活动");var timerInterval = setInterval(function(){tab.title.removeClass(活动");tab.content.removeClass(活动");curr = ++curr % tabs.length;tab = tabs[curr];tab.title.addClass(活动");tab.content.addClass(活动");}, tabLength);
实例
jQuery(document).ready(function() {功能 autoPlayTabs(tabTitle1, tabTitle2, tabTitle3, tabTitle4, tabContent1, tabContent2, tabContent3, tabContent4, tabLength, tabTitleMobile1, tabTitleMobile2, tabTitleMobile3, tabTitleMobile4) {var actualTabLength = tabLength * 4;var tabContainer = jQuery('.elementor-tabs');var allTabs = jQuery('.elementor-tabs .elementor-tabs-wrapper .elementor-tab-title');var allContent = jQuery('.elementor-tabs .elementor-tabs-content-wrapper .elementor-tab-content');var initialTabTimer = null;var tabTimer = null;常量选项卡 = [{标题:tabTitle1,内容:tabContent1},{标题:tabTitle2,内容:tabContent2},{标题:tabTitle3,内容:tabContent3},{标题:tabTitle4,内容:tabContent4}];让当前 = 0;让 tab = tabs[curr]tab.title.addClass("活动")tab.content.addClass("active");var timerInterval = setInterval(function(){tab.title.removeClass("活动")tab.content.removeClass("active");curr = ++curr % tabs.lengthtab = tabs[当前]tab.title.addClass("活动")tab.content.addClass("active");}, tabLength)allTabs.click(function() {if (initialTabTimer !== null) {clearTimeout(initialTabTimer);initialTabTimer = null;}if (tabTimer !== null) {clearInterval(tabTimer);tabTimer = null;}allTabs.removeClass('active');allContent.removeClass('active');tabContainer.addClass('tabsManual');});}如果($(#homeTabTitle1")){autoPlayTabs($("#homeTabTitle1"), $("#homeTabTitle2"), $("#homeTabTitle3"), $("#homeTabTitle4"), $("#homeTabContent1"), $("#homeTabContent2"),$("#homeTabContent3"), $("#homeTabContent4"), 1000);}});
.active { background-color:red }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><div id="homeTabTitle1">主页TabTitle1
<div id="homeTabTitle2">主页TabTitle2
<div id="homeTabTitle3">主页TabTitle3
<div id="homeTabTitle4">主页TabTitle4
<div id="homeTabContent1">主页标签内容1
<div id="homeTabContent2">主页TabContent2