For循环问题中的JavaScript setTimeout

时间:2017-01-20 02:12:55

标签: javascript for-loop settimeout

我的问题是我试图通过迭代值增加超时时间并将其时间增加1000.例如,如果增量值为5,则超时时它将为5 * 1000。

我尝试了第一种方式 - >

var textValue = 10;
function doSetTimeout(i) {
   setTimeout(function() { console.log(i); }, i * 1000);
}

for(var i = 1; i <= textValue; i++){
     doSetTimeout(i); 
 }     

我也试过这个 - &gt;

var textValue = 10;
 for(var i = 1; i <= textValue; i++){
     (function () {
         var j = i;         
         setTimeout(function timer() {
               console.log(j);
              },j*1000);
      })();     
 }

我得到的全部是,即使每次都正确设置变量,超时总是设置为1000毫秒。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

超时实际上是正确的持续时间,它们只是同时开始,因为setTimeout不会停止执行for循环。

这应该是你想要的:

var textValue = 10;
delayLoop(textValue);

function delayLoop(to, at) {
    var at = at || 1;
    if (at <= to) {
        setTimeout(function() {
            console.log(at);
            delayLoop(to, at + 1);
        }, 1000 * at);
    }
}

答案 1 :(得分:1)

你创建了一堆setTimeout在1000ms,2000ms,3000ms等之后被触发。问题是你同时创建它们,所以每次超时都会在下一次超时后1秒。有两种方法可以解决问题。

  1. 最初为每setTimeout计算正确的延迟。
  2. 第一个应该是1000毫秒。第二个应该是在1000ms + 2000ms之后。第三个应该是在1000 + 2000 + 3000之后等等。

    var timeoutSum = 0;
    for (var i = 1000; i <= 10000; i += 1000) {
        timeoutSum += i;
    
        setTimeout(function() { console.log("hi!"); }, timeoutSum);
    }
    
    1. 在您完成当前超时之前,不要触发下一次超时。
    2. 我们创建一个函数来添加一个新的超时,然后在超时结束时从被调用的函数中调用它。你可以把它想象成一个奇怪的倒置for循环,初始值在外面,条件在中间。

      var wait = 1000;
      
      function addTimeout(wait) {
          setTimeout(function() {
              console.log('hi'); 
      
              if (wait < 10000) {
                  addTimeout(wait + 1000);
              }
          }, wait);
      }
      
      addTimeout(wait);