Javascript 使用JS设置循环每次迭代的延迟

Javascript 使用JS设置循环每次迭代的延迟,javascript,loops,delay,Javascript,Loops,Delay,我正在尝试创建一个非常简单的倒计时。 当有人点击“随机挑选赢家”时,它会执行selectWinner() 我一直在试图找出如何在3,2,1之间稍微延迟执行循环。出于某种原因,无论我将setTimeout或setInterval放在何处,它都会在整个循环之后继续执行它 有什么建议吗 // Picking name from sorting hat const randomNumber = function () { winningNumber = Math.trunc(Math.rando

我正在尝试创建一个非常简单的倒计时。 当有人点击“随机挑选赢家”时,它会执行selectWinner()

我一直在试图找出如何在3,2,1之间稍微延迟执行循环。出于某种原因,无论我将setTimeout或setInterval放在何处,它都会在整个循环之后继续执行它

有什么建议吗

// Picking name from sorting hat
const randomNumber = function () {
    winningNumber = Math.trunc(Math.random() * winners.length) + 1;
}

function selectWinner() {
    for (let i = 3; i < 4; i--) {
        if (i == 0) {
            return;
        } else {
            setInterval(() => console.log(i), 500);
        }
    } 
}
//从分类帽中选取名称
常量随机数=函数(){
winningNumber=Math.trunc(Math.random()*winners.length)+1;
}
函数selectWinner(){
for(设i=3;i<4;i--){
如果(i==0){
回来
}否则{
setInterval(()=>console.log(i),500);
}
} 
}

您的方法存在的问题:

  • 或任何其他循环机制都是同步的,不会等待
  • setInterval
    将在每次滴答声时运行该函数。因此,如果您在每次迭代中添加它,您将添加多个间隔
  • 每当使用
    setInterval
    时,请接受计时器参考,以便将来在需要时将其关闭

您可以尝试以下方法:

  • 使用递归来创建循环
  • 由于您可以控制何时调用该函数,因此可以在此处添加延迟
使用
设置超时的示例

let count=3
函数决战(){
如果(计数){
设置超时(()=>{
console.log(计数--);
摊牌();
}, 1000)
}否则{
设置超时(()=>{
console.log('获胜者是…')
}, 1000)
}
}
摊牌()这就是你想要的吗

function selectWinner() {
  for (let i = 3, x = 1; i >= 0; i--, x++) {
    setTimeout(() => {
      if (i !== 0) {
        console.log(i);
      } else {
         console.log('and the winner is...');
      }
    }, 500 * x)
  } 
}

发生的情况是,每次调用setTimeout/setInterval时,它都会将延迟后发生的事情排队等待。但您的主代码仍在运行

e、 g

这将输出1,然后输出3,延迟后,将输出2。Javascript不会停止一切等待setTimeout的发生,它会继续执行其他任务

有两种方法可以让你实现你想要做的事情。最基本的选择(我向您推荐)就是不要使用for循环,而是让setInterval像for循环一样工作(意思是,让interval为您执行循环)。下面是一个工作示例:

函数倒计时(){
设i=4
常量间隔=设置间隔(()=>{
我--;
控制台日志(i)
如果(i==0){
清除间隔(间隔)
}
}, 500)
}

倒计时()
Sory。我没有注意到它是设定间隔。我修好了。它仍然不能正常工作。请注意编辑器中的
图标。您可以使用它制作一个代码段。还有,这是你想要的吗?这不是一种解释。请解释你改变的原因和原因。所以,不需要向任何人道歉。我们都会犯错误
console.log(1)
setTimeout(() => console.log(2), 100)
console.log(3)