Problème setTimeout et poo - valeur qui ne change pas (au secours...)

Résolu
0Philooz0 Messages postés 5 Date d'inscription mercredi 20 décembre 2000 Statut Membre Dernière intervention 1 septembre 2008 - 31 août 2008 à 14:34
0Philooz0 Messages postés 5 Date d'inscription mercredi 20 décembre 2000 Statut Membre Dernière intervention 1 septembre 2008 - 1 sept. 2008 à 08:50
Bonjour,

J'ai un problème ( depuis maintenant deux jours ) avec le bout de code suivant:

///Portion de code qui pose problème.
function MaClasse(){
    this.Local=this;
    this.Mamethodeaproblemes = function(objet,j){
      var i;
      for(i=0,i<j,i++){
           setTimeout(function(){
             this.Local.Uneautremethode(objet,i);
             },i*100);
      }
    }
    this.Uneautremethode=function(objet,valeur){
      //Fait des trucs sur objet.
      objet.propriete=valeur;
    }
}

//Nouvel objet.
var unobjet=new Object;
var monobjet=new MaClasse();
monobjet.Mamethodeaproblemes(unobjet,50);
////

Je m'explique. Ce code doit appeler une fonction avec setTimeout (afin d'affecter à objet.propriete les valeurs successives (de 0 à j).
Le problème, c'est que la valeur de i envoyée sur monobjet.Uneautremethode(unobjet,i); est toujours la même...
S'il vous plaît... Aidez-moi! Je deviens ...

Merci!

Philooz

9 réponses

bizibiz17 Messages postés 142 Date d'inscription mardi 17 janvier 2006 Statut Membre Dernière intervention 29 août 2009 1
31 août 2008 à 19:28
A priori la valeur de i doit être ici passée par référence = un pointeur, du coup lorsque tu essaies de lire sa valeur, tu lis la valeur que i possède à cet instant donc a priori la dernière car le code se déroulera plus vite que ton timeOut.
La solution serait donc comme tu disais un passage par valeur mais sur ce point je ne connais pas la solution, je ne sais même pas si c'est possible...
3
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
1 sept. 2008 à 06:06
bonjour,

problème souvent évoqué
mais comme on n'a pas toutes les billes pour appliqué à ton code,
un ch'tiot exemple sur des éléments html :
tu comprendras le principe

<!--\"#FBE7E7\"-->----
<html>
   
        <form name="frm">
           
           
           
        </form>
        <script type="text/javascript">
            for( var n=0; n<document.frm.t.length; n++)
            {    var Obj = document.frm.t[n];
<hr size="2" width="100%" />                     méthode 1
<hr size="2" width="100%" />                Obj.numChp = n;
                Obj.onmouseover = function ()  
                    { alert ( this.numChp ); }
<hr size="2" width="100%" />                     méthode 2
<hr size="2" width="100%" />                Obj.onclick = function(index)
                    {   return function()
                            { alert(index+1);};
                    }   (n);               
<hr size="2" width="100%" />            }
        </script>
   
</html>

je me garderais bien de te dire quelle méthode est la meilleure !

Cordialement   Bul  [mon Site] [M'écrire], <!--
3
0Philooz0 Messages postés 5 Date d'inscription mercredi 20 décembre 2000 Statut Membre Dernière intervention 1 septembre 2008
31 août 2008 à 14:43
Oups... Erreur de recopiage.
J'ai for(i=0;i<j;i++){ et nonfor(i=0,i<j,i++){, de même, var Local=this;et nonthis.Local=this;.
0
bizibiz17 Messages postés 142 Date d'inscription mardi 17 janvier 2006 Statut Membre Dernière intervention 29 août 2009 1
31 août 2008 à 17:01
Salut,

C'est un string qu'il faut passer en paramètre de setTimeout :

setTimeout(String fonc, Integer delai)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
0Philooz0 Messages postés 5 Date d'inscription mercredi 20 décembre 2000 Statut Membre Dernière intervention 1 septembre 2008
31 août 2008 à 18:42
Pour un appel de fonction, certes. Mais depuis JS 1.1, on peut passer une fonction.
Une solution serait de passer i par valeur. Quelqu'un a une idée?
0
tonytruand Messages postés 175 Date d'inscription samedi 23 octobre 2004 Statut Membre Dernière intervention 8 mars 2015
31 août 2008 à 19:06
salut

A tester :

      for(i=0;i<j;i++){
           setTimeout(function(){
             this.Local.Uneautremethode(objet,i);
             };i*100);

il faut mettre des " ;  " ici, il a peut être autre chose , mais ceci est à rectifier
0
0Philooz0 Messages postés 5 Date d'inscription mercredi 20 décembre 2000 Statut Membre Dernière intervention 1 septembre 2008
31 août 2008 à 19:17
Merci pour votre aide, tonytruand, mais cela ne fonctionne pas.

Apparemment, il semblerait que JS "transmet" la dernière valeur de i obtenue.
Dans mon code, si je mets

///Portion de code qui pose problème.
function MaClasse(){
    var Local= this;
    this.Mamethodeaproblemes = function(objet,j){
      var i;
      for(i=0,i<j,i++){
           setTimeout(function(){
             Local. Uneautremethode(objet,i);
             alert(i);
             },i*100);
      }
    }
    this.Uneautremethode =function(objet,valeur){
      //Fait des trucs sur objet.
      objet.propriete=valeur;
    }
}

//Nouvel objet.
var unobjet=new Object;
var monobjet=new MaClasse();
monobjet.Mamethodeaproblemes(unobjet,5);
////

J'ai le bon nombre d'appels (5), j'ai le bon timing, mais j'ai 5 fois la valeur 5...
Je me torture avec des eval() et autres, mais impossible de récupérer cette fichue valeur de i!

Je commence à désespérer...
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
1 sept. 2008 à 07:43
ch'tiote erreur : j'ai mis onclick sur l'un et onmouseover sur l'autre,
"bien entendu" c'est pour le même evênement.
CordialementBul[mon Site][M'écrire], <!--
0
0Philooz0 Messages postés 5 Date d'inscription mercredi 20 décembre 2000 Statut Membre Dernière intervention 1 septembre 2008
1 sept. 2008 à 08:50
Merci, je vais essayer de me débrouiller avec ça.
0
Rejoignez-nous