首页 > 解决方案 > 如何在不同的时间触发不同的 setInterval 函数?

问题描述

假设我有

let boo = setInterval(() => console.log('boo'), 5000);

假设我想添加另一个间隔函数,但我想确保它不会同时启动:

let bla = setInterval(() => console.log('bla'), 5000);

有没有办法检查第一个boo间隔何时触发并确保发生这种bla情况,不是同时发生,而是在 2500 ms 之后boo

标签: javascriptscheduled-taskssetinterval

解决方案


但我想确保它不会同时启动

它不能。JavaScript 在领域内运行单个线程(松散地,页面/选项卡)。从头到尾,该线程一次只做一件事。因此,即使这些计时器在同一微秒内触发,执行这些回调的作业也会进入同一个队列,并且线程一次处理一个。

如果计时器回调正在完成的工作启动了一个异步进程,则第二个计时器调用可以在计时器回调启动(并返回)之后但在异步工作完成时进入。如果你想防止这种情况,你必须在两者之间进行一些手动同步。

有没有办法检查第一个 boo 间隔何时会触发并确保 bla 发生,而不是同时发生,而是在 boo 之后 2500 ms 发生?

我可能会通过使用单个计时器来做到这一点:

let flag = true;
setInterval(() => {
    if (flag) {
        console.log("boo");
    } else {
        console.log("bla");
    }
    flag = !flag;
}, 2500);

推荐阅读