Javascript while循环中的setTimeout()方法

Javascript while循环中的setTimeout()方法,javascript,while-loop,settimeout,Javascript,While Loop,Settimeout,我已经阅读了关于w3schools和其他类似问题的相关页面,但似乎无法理解以下bit的错误: var myfunc03 = function (i) { document.getElementById('d01').innerHTML += 100-i+"<br>"; }; var myFunc01 = function() { i=0; while (i<100) { setTimeout(myfunc03(i), 1000) i++; }

我已经阅读了关于w3schools和其他类似问题的相关页面,但似乎无法理解以下bit的错误:

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

var myFunc01 = function() {
  i=0;
  while (i<100) {
    setTimeout(myfunc03(i), 1000)
    i++;
  }
};
var myfunc03=函数(i){
document.getElementById('d01')。innerHTML+=100-i+“
”; }; var myFunc01=函数(){ i=0;
虽然(iwhile
循环将不会等待完成。您需要为每个循环设置不同的时间延迟,以不同的时间执行它们,并使用闭包来保存
i
的值。同样,在您的情况下,函数将首先执行,返回值设置为中的参数,因此您需要在匿名函数中调用该函数或直接设置该函数

var myFunc01=function(){
var i=0;
而(i<100){
(职能(一){
setTimeout(函数(){
document.getElementById('d01')。innerHTML+=100-i+“
”; },1000*i) })(i++) } }; myFunc01();

while方法运行速度很快,所有超时几乎都在第一秒后执行。您可以做的是

  • 而不是从
    myfunc03
    调用
    $timeout
    以获取下一个值
  • 在您的while通话超时内,秒数不断增加,如
    i*1000
  • 另外,正如其他人指出的,您不能从
    setTimeout
    使用匿名函数,如

    ...
    while (i<100) {
      setTimeout(
         function(i){
            myfunc03(i);
         }, i*1000);
       i++;
    }
    ...
    
    。。。
    而(我
    • 我认为setTimeout中缺少分号,您应该尝试以以下方式传递参数:

      setTimeout(myfunc03, 1000*i, i); 
      

    • 是。您的代码中有两个问题:

    • 函数接受函数作为第一个参数,但在代码中,
      myfunc03(i)
      不返回任何内容
    • while循环不能满足您的需要,相反,您必须使用递归函数。因为第二个函数应该在触发第一个超时后调用
    • 示例代码:

      var myfunc03=函数(i){
      setTimeout(函数(){
      document.getElementById('d01')。innerHTML+=100-i+“
      ”; 如果(i<100){ i++; myfunc03(i); } }, 1000); }; var myFunc01=函数(){ myfunc03(0); }; myFunc01();

      您可以使用递归更简单地执行

      var i = 0;
      function f1() { ... };   
      function f() {
          f1();
          i += 1;
          setTimeout(function() {
              if(i < 100) {
                  f();
              }
          }, 1000);
      }
      f();
      
      var i=0;
      函数f1(){…};
      函数f(){
      f1();
      i+=1;
      setTimeout(函数(){
      如果(i<100){
      f();
      }
      }, 1000);
      }
      f();
      
      例子
      var i=0;
      var myfunc03=函数(i){
      document.getElementById('d01')。innerHTML+=100-i+“
      ”; }; var myFunc01=函数(){ myfunc03(i); i+=1; setTimeout(函数(){ 如果(i<100){ myFunc01(); } }, 1000); } myFunc01();

      等待
      设置超时时

      (async () => {
        var i = 0;
        while (await new Promise(resolve => setTimeout(() => resolve(i++), 1000)) < 100) {
          console.log("I get printed 100 times every second");
        }
      })();
      
      (异步()=>{
      var i=0;
      while(等待新承诺(resolve=>setTimeout(()=>resolve(i++),1000))<100){
      log(“我每秒打印100次”);
      }
      })();
      
      一个简单的选择是使用
      setInterval()
      方法。 setInterval每次都将作为循环执行代码,直到您使用
      clearInterval()
      方法将其中断

      示例

      var i = 0;
      function f1() { ... };   
      function f() {
          f1();
          i += 1;
          setTimeout(function() {
              if(i < 100) {
                  f();
              }
          }, 1000);
      }
      f();
      
      var指数=0;
      让incrementEveryHalfSecond=setInterval(函数(){
      索引++;
      document.querySelector(“body”).innerHTML+=index+'
      '; 如果(索引==10)clearInterval(每半秒递增一次) },500)

      这当然突出了他的第二个错误——访问修改过的变量(
      i
      )在闭包内。当超时触发时,
      i
      将更改为最后一个参数。
      setTimeout
      要求将
      函数
      作为第一个参数,但您正在传递
      myfunc03
      的结果(这是
      定义不足的,因为您正在调用它)请写下你的答案。这是不可读的,也不是understandable@mplungjan是的,我的错!你没有解决关闭问题我知道,其他人已经这样做了,最初我错过了。所以我只是修改了我原来的答案。我觉得抄袭别人的答案是不对的:)@mplungjan没关系。我写东西不只是为了选票或名誉。只是消磨一些空闲时间,帮助其他程序员:)无论如何,正如您坚持的那样,更正了答案对于现代浏览器来说,这是最好的解决方案,因为它避免了闭包的尴尬。但是,第二个参数应该是
      1000*i
      ;否则,您将同时将100个超时设置为1s。与Yea相比,这是正确的。我打算只显示语法方面的,因为这是might导致了js错误。他可能会根据他的逻辑要求使用时间参数。详细解释。我遇到了相同的问题。非常好的示例,谢谢!