Javascript 如何在永久循环中包装连续的setInterval()?

Javascript 如何在永久循环中包装连续的setInterval()?,javascript,node.js,setinterval,Javascript,Node.js,Setinterval,我试图实现一个函数,它应该每5秒发布一次测量值a,持续10次,然后每5秒发布一次测量值B,持续随机时间。我想永远重复这个函数,因为我试图实现一个假的代理 所以我有了密码: let intervalId = null, repeat = 0; while (true) { intervalId = setInterval(() => { if (repeat < 5) { // post measurement A repeat +=

我试图实现一个函数,它应该每5秒发布一次测量值a,持续10次,然后每5秒发布一次测量值B,持续随机时间。我想永远重复这个函数,因为我试图实现一个假的代理

所以我有了密码:

let intervalId = null, repeat = 0;
while (true) {
    intervalId = setInterval(() => {
      if (repeat < 5) {
        // post measurement A
        repeat += 1;
      }
      else {
        clearInterval(intervalId)
      }
    }, 1000);

    repeat = 0;
    intervalId = setInterval(() => {
      if (repeat < Math.floor(Math.random() * 11)) {
        // post measurement B
        repeat += 1;
      }
      else {
        clearInterval(intervalId)
      }
    }, 1000);
}
让intervalId=null,repeat=0;
while(true){
intervalId=setInterval(()=>{
如果(重复<5次){
//测量后A
重复次数+=1;
}
否则{
clearInterval(有效期间)
}
}, 1000);
重复=0;
intervalId=setInterval(()=>{
如果(重复

两个
setInterval()
函数并没有像我预期的那样连续发生,而是同时发生。而且
while(true)
循环的行为似乎也不符合预期。我只是想知道有没有办法解决这个问题?谢谢。

在代码之上工作,首先,在循环时删除无限
。它将以同步方式无休止地运行,而
setInterval
是异步的<代码>重复
值将远远领先于执行
重复+=1

其次,在函数中对它们进行分解,以便它们对
intervalId
repeat
值有自己的闭包

函数间隔(){
设intervalId=null
让我们重复=0
intervalId=setInterval(()=>{
如果(重复<5次){
console.log(新日期(),'A')
//测量后A
repeat+=1;//在回调中递增repeat。
}
否则{
clearInterval(intervalId);//使用interval完成后,清除该间隔
intervalB();//并开始间隔B
}
}, 1000)
}
函数间隔b(){
让我们重复=0
让randomEnd=Math.floor(Math.random()*11)//计算它应该何时结束。
让intervalId=setInterval(()=>{
如果(重复<结束){
log(新日期(),'B将在'randomEnd','times'中完成)
重复+=1
}
否则{
clearInterval(intervalId)//完成后清除间隔
}
}, 1000)
}

间隔()//从时间间隔A开始当前,时间间隔在脚本开始时以及此后的每个时间间隔期间同步设置。如果您仅使用一个间隔,并使用一个变量指示要运行的度量,并在每个随机第n次迭代中更改该变量,可能会更清楚:

const getRandomRepeats=()=>Math.ceil(Math.random()*11)
让repeatsRemaining=getRandomRepeats();;
让measureA=true;
设置间隔(()=>{
重复维护--;
如果(重复维护===0){
repeatsRemaining=getRandomRepeats();
measureA=!measureA;
}
log('repeats remaining:'+repeats remaining);
if(measureA){
console.log('posting a');
}否则{
console.log('posting b');
}

}, 1000);
您可以创建两个
函数,一个是
doA()
,一个是
doB()

doA()
开始,计算调用doA
的时间数,当到达
10
时,
clearInterval
并调用
doB()

doB()
中,设置应调用它的
min
max
时间,然后在达到
randTime
clearInterval
doA()


虽然循环不是你想要的,但代码实际上在创建一个不合理的间隔数。你想把测量值A发布10次,然后在它发布10次后,每隔5秒发布一次测量值B,在随机周期结束后,重复这个过程吗?你的第一组将运行每秒5次
setInterval
只需设置一个计时器,该计时器每x毫秒运行一次函数,然后返回计时器的id。它不会等到所有的间隔都结束。很抱歉前面的评论。。。我没有仔细阅读代码。非常感谢这个答案解决了我的问题!我学会了一个聪明的把戏哈哈xD
function doA() {

  let count = 0;
  const a = setInterval(() => {
    //do A
    console.log('do A');
    count += 1;
    if (count === 10) {
      clearInterval(a);
      doB();
    }
  }, 5000/10);

}
function doB() {
  // set your min and max for B
  const minTime = 1;
  const maxTime = 10;
  const randTime = Math.floor(Math.random() * (maxTime - minTime + 1)) + minTime;
  let count = 0;
  const b = setInterval(() => {
    // do B
    console.log(randTime);
    console.log('do B');
    count += 1;
    if (count === randTime) {
      clearInterval(b);
      doA();
    }
  }, 5000 / randTime);
}
doA();