IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Passer une methode de classe a setInterval


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut Passer une methode de classe a setInterval
    Bonjour,

    Je débute en js, et cherche a faire le script suivant :
    j'ai un objet engine, qui a une methode run(), et je veux appeler périodiquement run d'une instance de engine via setInterval. Voila mon code

    index.html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <html>
    <head>
    <title>Test</title>
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
     
    <script type="text/javascript" src="./sources/prototype.js"></script>
    <script type="text/javascript" src="./sources/engine.js"></script>
    <script type="text/javascript">
      function Start()
      {
        var engine = new MyEngine();
     
        engine.configure();
        engine.start();
      }
    </script>
    </head>
    <body onload="Start();">
    </body>
    </html>
    engine.js
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    var MyEngine = Class.create(
    {
    	initialize: function()
    	{
    		this.m_lastTime = 0;
    		this.m_startTime = new Date().getTime();
    	},
     
    	start: function()
    	{
    		setInterval(this.run, 15);
    	},
     
    	configure: function()
    	{	
    		// rien pour l'instant
    	},
     
    	run: function()
    	{
    		var timeNow = new Date().getTime();
    		if (this.m_lastTime != 0)
    		{
    			var elapsed = timeNow - this.m_lastTime;
    			var total = timeNow - this.m_startTime;
    			if (total > 1000)
    			{
    				alert("more than 1000 elapsed !");
    			}
    		}
    		this.m_lastTime = timeNow;
    	}	
    });
    donc quand je charge ma page, d'après le debugeur js de chrome, je commence bien par passer dans mon initialize qui init les deux propriétés, puis je passe ensuite dans mes run, mais des le premier run les valeur de m_lastTime et m_startTime ne sont plus initialisées. Je n'ai pas conséquent jamais l'alerte car mon total vaut NaN...
    Je ne comprend pas pourquoi ?

  2. #2
    Membre expérimenté
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Points : 1 333
    Points
    1 333
    Par défaut
    Bonjour,

    Ton problème, c'est que tu la fonction run de ton objet, mais sans l'objet lui même...

    Tu as l'air d'utiliser prototype pour créer ta classe, il faut donc que tu crées une fonction anonyme qui soit liée à ton objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // ...
    start: function()
    	{
    		setInterval(this.run.bind(this), 15);
    	},
    // ...
    on ne dit pas "ça ne marche pas" on dit "je suis incapable de faire fonctionner correctement les outils mis à ma disposition"
    Pas de question technique par MP

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    d'accord, alors cela veut dire que lorsqu'on declare une methode d'objet ce n'est pas vraiment une methode lie aux instances de notre classe, mais juste une fonction independante en fait ?
    ou alors une methode de classe comme par exemple une methode static en c++ ?

    Je viens du C++, et je n'ai pas encore bien saisi le principe objet de javacript, d'ailleur si quelqu'un sait ou je peux trouver des explications sur la logique js, ca m'interesse, car a par des infos sur la syntaxe elle meme je ne trouve pas grand chose.

  4. #4
    Membre expérimenté
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Points : 1 333
    Points
    1 333
    Par défaut
    C'est surtout que quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setInterval(this.run, 15)
    this.run renvoie une fonction. Mais pas la méthode de l'objet, elle est dé-contextualisée.

    Dans ce genre de cas, j'ai tendance à faire autrement (parce que je n'aime pas non plus écrire this.method.bind(this)):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    var MaClasse = Class.create({
      initialize: function() {
        // ...
      },
      methode1: function() {
        // ...
      },
      start: function() {
        setInterval(MaClasse.run.curry(this), 15);
      },
      // ...
    });
     
    // Définition de méthode statiques :
    Object.extend(MaClasse, {
      run: function(instance) {
        instance.methode1();
      }
    });
    on ne dit pas "ça ne marche pas" on dit "je suis incapable de faire fonctionner correctement les outils mis à ma disposition"
    Pas de question technique par MP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel d'une methode de classe par message inopérant dans une dll
    Par Jacques Deyrieux dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 10/08/2010, 08h10
  2. Passer une methode en argument
    Par archer dans le forum C#
    Réponses: 1
    Dernier message: 06/08/2008, 16h42
  3. [POO] appeler une methode de classe dans une fonction
    Par ryykko dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/02/2008, 22h10
  4. execution de blt dans une methode de classe
    Par micflor dans le forum DirectX
    Réponses: 2
    Dernier message: 13/03/2006, 20h31
  5. [POO] Prob avec une méthode de classe
    Par Ludo75 dans le forum Langage
    Réponses: 9
    Dernier message: 06/02/2006, 22h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo