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 :

setTimeout avec une méthode privée


Sujet :

JavaScript

  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut setTimeout avec une méthode privée
    Bonjour,

    J'ai quelque petit problème lorsque j'appel une méthode privée avec la un setTimeout. La première tentative s'effectue correctement mais les autres échouent avec l'erreur suivante : "DoMove is not defined". Pourtant cette fonction est bien définie à l'intérieur de mon objet...

    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
     
    function MyObject( x, y, z ) {
        this.StartMovement = function() {
            // ...
            DoMove();
            // ...
        }
     
        function DoMove() {
            alert( "Moving..." );
            setTimeout( "DoMove()", 1000 );
        }
    }
     
    // Test call
    var Test = new MyObject( 0, 0, 0 );
    Test.StartMovement();
    Merci à tous.

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    heu le setTimeout de la fonction dans la fonction c'est moyen ...
    il existe le setInterval pour ça ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function DoMove() {
            alert( "Moving..." );
     
        }
     
     var moving= setInterval(function(){ DoMove()}, 1000 );

  3. #3
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    si tu veux garder cette architecture, écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout(DoMove, 1000 );

  4. #4
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par javatwister
    si tu veux garder cette architecture, écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout(DoMove, 1000 );
    Merci, cela fonctionne
    Mais alors pourquoi cela fonctionne QUE lorsqu'on passe la fonction en référence et non "DoMove(...)" ?

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      setTimeout( function(){DoMove()}, 1000 );
    devrait fonctionner aussi ..

  6. #6
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    la tu passes un pointeur alors que dans une chaine, il l'évalue au moment ou il l'execute et elle est hors de portée

  7. #7
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Merci à tous

  8. #8
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    J'ai toutefois un autre petit problème.
    J'ai besion d'appeler deux fonction dans le setTimeout.

    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
    function MyObject( x, y, z ) {
        this.StartMovement = function() {
            // ...
            DoMove();
            // ...
        }
        
        function DoMove() {
            alert( "Moving..." );
            // Erreur
            setTimeout( DoMove, DoOtherStuff, 1000 ); 
            // Pas d'erreur mais cela fait rien, aucune des deux fonction ne s'exécute
            setTimeout( fonction () { DoMove; DoOtherStuff; }, 1000 ); 
        }
    
        function DoOtherStuff() {
            alert( "Do other stuff..." );
        }
    }
    
    // Test call
    var Test = new MyObject( 0, 0, 0 );
    Test.StartMovement();
    Comment faire pour exécuter deux méthodes dans le setTimeout ?
    Merci

  9. #9
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout( fonction () { DoMove; DoOtherStuff; }, 1000 );
    avec des () apres les noms ca sera mieux je pense mais vu que domove s'appel met peut etre otherstuff avant

  10. #10
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 239
    Points
    3 239
    Par défaut
    Citation Envoyé par Erakis
    J'ai toutefois un autre petit problème.
    J'ai besion d'appeler deux fonction dans le setTimeout.

    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
    function MyObject( x, y, z ) {
        this.StartMovement = function() {
            // ...
            DoMove();
            // ...
        }
        
        function DoMove() {
            alert( "Moving..." );
            // Erreur
            setTimeout( DoMove, DoOtherStuff, 1000 ); 
            // Pas d'erreur mais cela fait rien, aucune des deux fonction ne s'exécute
            setTimeout( fonction () { DoMove; DoOtherStuff; }, 1000 ); 
        }
    
        function DoOtherStuff() {
            alert( "Do other stuff..." );
        }
    }
    
    // Test call
    var Test = new MyObject( 0, 0, 0 );
    Test.StartMovement();
    Comment faire pour exécuter deux méthodes dans le setTimeout ?
    Merci
    Et si tu mettais deux setTimeout ? (Bien que la méthode de siddh, avec des paranthèses, marche très bien)
    Ca me semble plus simple...

  11. #11
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Merci

  12. #12
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Bonjour.
    J'ai exactement le même besoin.(c'est pour ca que je me permet de m'incruster dans ce post :-p) Mais je n'ai pas déclaré avec la même syntaxe les méthodes de ma classe. Je n'arrive pas a appliquer vos solutions sur ma classe. Bien sur je pourrais la re-coder en utilisant la syntaxe qui fonctionne avec les solution décrites, mais je voudrait savoir si c'est possible avec la syntaxe que j'ai adopté l'histoire de ne pas mourrir bête.

    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
     
    /*-----------Debut de la classe-------------------*/   
    function MyObject( x, y, z ) {
      this.StartMovement = function() {
        // ...
        var moving= setInterval(DoMove, 3000 );
        // ...
      }
      //Declaration d'une méthode de la classe MyObject.
      this.DoMove = MyObject_DoMove;        
    }
     
    //Implementation de la méthode.
    function MyObject_DoMove() {
      alert("DoMove appelé");
      setTimeout(DoMove, 1000 );
    }
    /*--------------fin de la classe------------------*/
     
    // Test call
    var Test = new MyObject( 0, 0, 0 );
    Test.StartMovement();
    Comment puis-je appeler ma fonction recursivement, j'ai besoin du nom de l'objet si je veut l'appeler entre guillemet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setTimeout("Test.DoMove()", 1000 );
    Mais je ne crois pas qu'il soit possible de récuperer son propre nom d'instance. Ou alors je doit pouvoir faire reference a mon propre objet avec le mot clef "this". Voici ce que j'ai essayé dans ma fonction "MyObject_DoMove()" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setTimeout(this.DoMove, 1000 );
    mais je n'obtiens que des erreurs.

    D'autre part j'ai cherché a comprendre ce morceau de code en vain :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var moving= setInterval(function(){ DoMove()}, 1000 );
    J'ai bien compris a quoi servait "moving" ainsi que le fonctionnement du setInterval. Mais je ne comprend pas a quoi servent les accolades autour du DoMove : "function(){ DoMove()}". Ni le "function" devant.

    Euh voila.

  13. #13
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    en fait dans un setInterval ou timeout, il faut passer une reference a ce que l'on veut executer.

    donc soit un nom de fonction (sans les () sinon c est un appel et pas une ref)
    soit une fonction créée a la volée en faisant function(){ //corps }

    on peut tout a fait créer une fonction de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var hello = function(name){ alert('hello '+name); }
    et ensuite faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hello('pataphysicien');
    mais la je comprend pas trop ce que tu veux faire puisque le setIntervall va declencher a interval régulier domove.

    si en plus tu lui met un setTimeout avec recursivité, ca risque de boucler severe ton histoire là.

    l'avantage de cette syntaxe pour les timeout c'est qu'au moment ou la fonction est créée, il "voit" la fonction qu'on appel

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

Discussions similaires

  1. Pb avec une méthode de classe
    Par damien27000 dans le forum Langage
    Réponses: 5
    Dernier message: 29/08/2007, 17h50
  2. Réponses: 2
    Dernier message: 01/05/2007, 18h50
  3. Réponses: 7
    Dernier message: 19/03/2007, 20h25
  4. Réponses: 3
    Dernier message: 22/02/2007, 20h02
  5. Problème avec une méthode virtuelle pure
    Par Burckel dans le forum C++
    Réponses: 4
    Dernier message: 05/12/2006, 13h00

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