【问题标题】:Correctly delaying setTimeout [duplicate]正确延迟 setTimeout [重复]
【发布时间】:2022-01-08 01:48:09
【问题描述】:

在下面的函数中

function test1(n, delay) {
  for (let i = 0; i < n; i++) {
    setTimeout(() => {
      console.log(i)      
    }, delay)    
  }  
}

test1(3, 1000)

1秒后,我立即console.log1、2、3同时进行。

如果我将delay 乘以i

function test1(n, delay) {
  for (let i = 0; i < n; i++) {
    setTimeout(() => {
      console.log(i)      
    }, i * delay)    
  }  
}

test1(3, 1000)

1 秒后,我在循环中的每个 i console.log。为什么会这样?

还有,为什么下面的代码

function test2(n, delay) {
  let promise = new Promise(resolve => setTimeout(() => {
    resolve()    
  }, delay))
  for (let i = 0; i < n; i++) {
    promise.then(console.log(i))  
  }  
}

test2(3, 1000)

立即console.log 1、2 和 3 同时而不是每秒等待console.log 下一个i 值?有没有办法在不使用asyncawait 的情况下每秒等待后使用承诺链接来console.log 下一个i 值?

【问题讨论】:

  • 有多个问题,而且都是重复的。 “有没有办法在不使用 async 和 await 的情况下,在每秒等待后控制台记录下一个 i 值?”stackoverflow.com/a/70213768/16540390

标签: javascript algorithm


【解决方案1】:

我们需要将idelay 相乘的原因是您设置了一个timeout 超时时间为1s/2s/3s。在示例中,您让console.log() 在 1 秒、2 秒和 3 秒后执行它.....

如果您不将i 与延迟相乘,那么您使用for 循环分配的所有超时将在1 (delay) 秒后同时执行(您几乎可以忽略@ 的执行时间987654328@循环。

另一种每秒循环的解决方案是使用setInterval

let i = 0;
let interval;
function test2(n,delay){
 //Change millisecond to second
   delay*=1000
   interval = setInterval(function(){
       console.log(i);
       i++;
       if(i>n)
       window.clearInterval(interval)
    },delay)
   }
test2(10,1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多