while循环中的setTimeout()方法

hav*_*avz 6 javascript while-loop settimeout

我在这里阅读了w3schools和其他类似问题的相关页面,但似乎无法理解下面的内容有什么不对:

var myfunc03 = function (i) {
  document.getElementById('d01').innerHTML += 100-i+"<br>";
};

var myFunc01 = function() {
  i=0;
  while (i<100) {
    setTimeout(myfunc03(i), 1000)
    i++;
  }
};
Run Code Online (Sandbox Code Playgroud)

何时myFunc01();运行.

没有任何暂停,i的所有可能值都会立即列出.

这里有逻辑错误吗?

Sun*_*Sun 9

你可以通过递归更简单地做到这一点:

var i = 0;
function f1() { ... };   
function f() {
    f1();
    i += 1;
    setTimeout(function() {
        if(i < 100) {
            f();
        }
    }, 1000);
}
f();
Run Code Online (Sandbox Code Playgroud)

var i = 0;

var myfunc03 = function(i) {
  document.getElementById('d01').innerHTML += 100 - i + "<br>";
};

var myFunc01 = function() {
  myfunc03(i);
  i += 1;
  setTimeout(function() {
    if (i < 100) {
      myFunc01();
    }
  }, 1000);
}

myFunc01();
Run Code Online (Sandbox Code Playgroud)
<div id="d01"></div>
Run Code Online (Sandbox Code Playgroud)


可重用的功能

function say(sentence) {
  console.log(sentence);
}

function sayHello() {
  say("Hello!");
}

var fn = sayHello;
var count = 10;
var ms = 1000;

function repeat(fn, count, ms) {
  var i = 0;

  function f() {
    fn();
    i += 1;
    setTimeout(function() {
      if (i < count) {
        f();
      }
    }, ms);
  }

  f();
}

repeat(fn, count, ms);
Run Code Online (Sandbox Code Playgroud)


Pra*_*lan 7

while循环不会等待setTimeout()完成.您需要为每个设置不同的时间延迟以使用不同的时间执行它们,并使用闭包来保持值i.同样在你的情况下,函数最初将被执行并且返回值被设置为参数setTimeout(),因此要么需要在匿名函数内调用函数,要么直接设置函数.

var myFunc01 = function() {
  var i = 0;
  while (i < 100) {
    (function(i) {
      setTimeout(function() {
        document.getElementById('d01').innerHTML += 100 - i + "<br>";
      }, 1000 * i)
    })(i++)
  }
};

myFunc01();
Run Code Online (Sandbox Code Playgroud)
<span id="d01"></span>
Run Code Online (Sandbox Code Playgroud)


虽然setInterval()可以在这里使用

var myFunc01 = function() {
  var i = 0;
  // store the interval id to clear in future
  var intr = setInterval(function() {
    document.getElementById('d01').innerHTML += 100 - i + "<br>";
    // clear the interval if `i` reached 100
    if (++i == 100) clearInterval(intr);
  }, 1000)

}

myFunc01();
Run Code Online (Sandbox Code Playgroud)
<span id="d01"></span>
Run Code Online (Sandbox Code Playgroud)

  • 彻底的解释。我遇到了同样的问题。很好的例子,谢谢! (2认同)