为何setInterval未每1000ms交替触发tick/tock却每2000ms同步触发?
问题分析与解决方案
先直接点出你的代码核心问题:setTimeout的第一个参数传错了,导致第二个setInterval被立即创建,而不是延迟1000ms启动,两个定时器同时跑自然没法实现交替效果。
拆解你的代码问题
我们聚焦关键代码段来分析:
// 第一个定时器:每2000ms执行一次tick tickID = setInterval( () => this.tick(), 2000 ); // 这里是核心错误! tockID = setTimeout( console.log( setInterval( () => this.tock(), 2000) ), 1000 );
setTimeout的第一个参数需要传入函数引用,但你现在写的console.log(...)是一个立即执行的表达式——它会立刻完成两件事:
- 直接创建第二个
setInterval(和第一个定时器几乎同时启动,两者间隔都是2000ms) - 打印这个新定时器的ID,然后把
console.log的返回值undefined传给setTimeout
最终结果就是两个定时器同时每隔2000ms分别输出1和2,完全达不到你想要的交替触发效果。
另外提个小细节:你用了this.tick()和this.tock(),在全局作用域下箭头函数里的this指向全局对象,虽然能运行,但直接写tick()/tock()更清晰,能避免不必要的this指向混淆。
符合你要求的实现(不用布尔值)
既然不能用布尔值判断状态,我们可以用**嵌套的setTimeout**来实现交替触发:每次执行完一个函数,就安排下一个函数在1000ms后执行,形成循环。代码如下:
const tick = () => { console.log(1); // 执行完tick后,1000ms后调用tock setTimeout(tock, 1000); }; const tock = () => { console.log(2); // 执行完tock后,1000ms后调用tick setTimeout(tick, 1000); }; // 启动第一个函数 tick();
这个逻辑很直观:
- 第一次调用
tick输出1,随后安排1000ms后执行tock tock执行时输出2,再安排1000ms后执行tick- 以此循环,完美实现每1000ms交替输出1和2的效果,完全不需要状态判断。
内容的提问来源于stack exchange,提问作者Paul Thomas Clarke
相关产品推荐
相关产品推荐

