Javascript 如何基于其他循环中的变量创建定时循环?

Javascript 如何基于其他循环中的变量创建定时循环?,javascript,for-loop,settimeout,Javascript,For Loop,Settimeout,我试图创建一个定时循环,该循环遍历一个对象数组,并根据每个对象中的key:value运行计时器。为了简单起见,我只在函数中调用了控制台日志。 我需要采取的步骤是: 计时器在被调用时记录列表中的第一项 计时器然后记录以秒为单位的倒计时,从第一个项目的值开始计时,并每秒记录新的时间 当时间达到0时,有一个等于wait变量的倒计时 记录下一项,然后重复倒计时和等待步骤,然后移动到列表中的下一项 以下是没有任何计时器的代码: const list = [{ item: 'Item 1

我试图创建一个定时循环,该循环遍历一个对象数组,并根据每个对象中的key:value运行计时器。为了简单起见,我只在函数中调用了控制台日志。 我需要采取的步骤是:

  • 计时器在被调用时记录列表中的第一项
  • 计时器然后记录以秒为单位的倒计时,从第一个项目的值开始计时,并每秒记录新的时间
  • 当时间达到0时,有一个等于wait变量的倒计时
  • 记录下一项,然后重复倒计时和等待步骤,然后移动到列表中的下一项
以下是没有任何计时器的代码:

const list = [{
        item: 'Item 1',
        time: 30
    },
    {
        item: 'Item 2',
        time: 25
    },
    {
        item: 'Item 3',
        time: 40
    }
];

const wait = 5;

function logger(input, suffix) {
    console.log(`${input} ${suffix}`)
}

function runTimer() {
    logger(list[0].item, 'timer')
    for (let i = 0; i < list.length; i++) {
        logger(list[i].item, 'timer');
        for (t = list[i].time; t > 0; t--) {
            logger(t, 'seconds');
        }
        for (let w = wait; w > 0; w--) {
            logger(w, 'secs wait')
        }
    }
};

runTimer();
const list=[{
项目:“项目1”,
时间:30
},
{
项目:“项目2”,
时间:25
},
{
项目:“项目3”,
时间:40
}
];
常数等待=5;
功能记录器(输入,后缀){
log(`${input}${suffix}`)
}
函数runTimer(){
记录器(列表[0]。项“计时器”)
for(设i=0;i0;t--){
记录器(t,“秒”);
}
for(让w=wait;w>0;w--){
记录器(带“秒等待”)
}
}
};
运行计时器();
我可以获得正确的日志顺序,但我正在努力获得正确的时间,我在调用多个定时循环中的SetTimeout时迷失了方向。我该怎么做呢?

希望这有帮助

const list = [ {
            item:'Item 1',
            time:5
        },
        {
            item:'Item 2',
            time:3
        },
        {
            item:'Item 3',
            time:6
        }
    ];

    const wait = 5;

    let itemCounter = 0;
    runTimer();

    function runTimer() {
        //  Timer for each item in list
        console.log(list[itemCounter].item+ " timer");

        var timer = list[itemCounter].time;
        var interval = setInterval(function() {

            var minutes = parseInt(timer / 60, 10),
                seconds = parseInt(timer % 60, 10);

            minutes = minutes < 10 ? "0" + minutes : minutes;
            seconds = seconds < 10 ? "0" + seconds : seconds;

            console.log(minutes+ " : " +seconds);

            if(timer-- <= 0) {
                clearInterval(interval);
                waitTimer(); 
            }            
        }, 1000);
    }

    function waitTimer() {
        //  Timer for "wait time" after an Item timer is complete
        var timer = wait;
        console.log("Wait timer after "+list[itemCounter].item+" timer")
        var interval = setInterval(function() {

            var minutes = parseInt(timer / 60, 10),
                seconds = parseInt(timer % 60, 10);

            minutes = minutes < 10 ? "0" + minutes : minutes;
            seconds = seconds < 10 ? "0" + seconds : seconds;

            console.log(minutes+ " : " +seconds);

            if(timer-- <= 0) {
                clearInterval(interval);
                itemCounter++;
                if(itemCounter < list.length) {
                    runTimer();
                }
            }            
        }, 1000);
    }
const list=[{
项目:“项目1”,
时间:5
},
{
项目:“项目2”,
时间:3
},
{
项目:“项目3”,
时间:6
}
];
常数等待=5;
设itemCounter=0;
运行计时器();
函数runTimer(){
//列表中每个项目的计时器
log(列表[itemCounter].item+“计时器”);
变量计时器=列表[itemCounter]。时间;
var interval=setInterval(函数(){
var分钟=parseInt(计时器/60,10),
秒=parseInt(计时器%60,10);
分钟=分钟<10?“0”+分钟:分钟;
秒=秒<10?“0”+秒:秒;
console.log(分钟+”:“+秒);

如果(计时器--我建议您使用chained来实现这一点。您可以从创建一个通用的
倒计时
函数开始,该函数返回一个
承诺

function countdown(time, msg) {
  return new Promise(resolve => {
    const i = setInterval(() => {
      logger(time, msg);
      if (time === 0) { // the promise resolves once the time reaches 0
        clearInterval(i);
        resolve();
      }
      time--;
    }, 1000);
  });
}
然后,您可以使用此功能将每个项目的计数与等待时间相结合:

function runTimer () {
  let p = Promise.resolve();
  for (let i of list) {
    p = p.then(() => countdown(i.time, i.item).then(() => countdown(wait, 'wait')));
  }
  p.then(() => console.log('done!'));
};
以下是完整的示例:

const list=[
{
项目:“项目1”,
时间:3
},
{
项目:“项目2”,
时间:5
},
{
项目:“项目3”,
时间:4
}
];
常数等待=5;
功能记录器(输入,后缀){
log(`${input}${suffix}`)
}
函数运行计时器(){
设p=Promise.resolve();
对于(让我列出){
p=p.then(()=>倒计时(i.time,i.item)。然后(()=>倒计时(wait,'wait'));
}
p、 然后(()=>console.log('done!'));
};
函数倒计时(时间,msg){
返回新承诺(解决=>{
常数i=设置间隔(()=>{
记录器(时间,msg);
如果(时间==0){
间隔时间(i);
解决();
}
时间--;
}, 1000);
});
}
runTimer();