web-dev-qa-db-fra.com

méthode setTimeout () dans une boucle while

J'ai lu les pages pertinentes sur w3schools et d'autres questions similaires ici, mais je n'arrive pas à comprendre ce qui ne va pas dans la partie suivante:

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

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

lorsque myFunc01(); est exécuté.

Il n'y a aucune pause et toutes les valeurs possibles pour i sont listées en même temps.

Y a-t-il une erreur logique ici?

5
havz

Vous pouvez le faire plus simplement avec récursion :

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

Exemple

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();
<div id="d01"></div>

Une fonction réutilisable

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);
5
Sun

Oui. Il y a 2 problèmes dans votre code:

  1. La fonction setTimeout accepte une fonction comme premier argument, mais dans votre code, myfunc03(i) ne renvoie rien.
  2. La boucle while ne répondra pas à vos besoins, vous devez utiliser une fonction récursive. Étant donné que la deuxième fonction doit être invoquée après le déclenchement du premier délai d'attente.

Exemple de code:

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

var myFunc01 = function() {
  myfunc03(0);
};

myFunc01();
<div id="d01"></div>
1
hoozecn
  • Je pense qu'il vous manque un point-virgule sur setTimeout et vous devriez essayer de passer les arguments de la façon suivante:

    setTimeout(myfunc03, 1000*i, i); 
    
0
Utkarsh Sinha