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 et son callback


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 2
    Points : 3
    Points
    3
    Par défaut setTimeout et son callback
    Bonsoir Developpez.net Section JS !,

    J'aimerais terminer une petite fonction pour afficher lettre par lettre un mot que je lui donne, dans un paragraphe de mon DOM.

    Voici le code du <body> :
    Code html : 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
     
    <body>
    	<div><p></p></div>
     
    	<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    	<script type="text/javascript">
                    $(function() {
                            function displayWord(word, p) {
                                    var time = 0;
                                    for (i=0; i<word.length; i++)
                                    {
                                            time = time + 50;
                                            setTimeout(function() { p.append(word.charAt(i)); }, time);
                                    }
                            }
     
                            var p = $('p');
                            displayWord('word', p);
                    });
            </script>
    </body>

    Vous vous rendrez compte qu'il y a un problème, c'est que mes callbacks sont executés après que la boucle ait été parcourue 4 fois (pour le mot "word"), et donc les 4 callbacks function() du setTimeout essayent d'afficher la lettre située a l'index 4 de la chaine de caractère "word". Mon but serait donc de "figer" la valeur de ma variable i au moment ou je déclare le callback, ou de le transformer en constante, ou quelque chose d'autre, et étant débutant en javascript je ne sais pas comment faire...

    Quelqu'un peut m'éclairer ?

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Ton problème est un problème de portée. Lorsque tu créées tous tes timeouts dans ta boucle for, tu définis en fait un certain nombre de fonctions qui seront appelées plus tard. À la fin de ta boucle, tes variables se trouvent dans leur état de fin de boucle (dans ton exemple i = 4), et toutes les fonctions qui ont été planifiées utiliseront ces valeurs.

    Pour enchaîner les timeouts, il est plus courant de définir une fonction à l'avance, qui s'auto-rappellera autant de fois qu'elle aura besoin.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function displayChar(word, p, i) {
       if (i < word.length) {
          p.append(word.charAt(i));
          setTimeout(function() { displayChar(word, p, i+1); }, 50);
       }
    }
     
    function displayWord(word, p) {
       displayChar(word, p, 0);
    }
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Merci Watilin, C'est plus clair et plus léger en plus !

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

Discussions similaires

  1. Comportement du callback passé à setTimeout (Firefox)
    Par Mic75 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 12/10/2012, 11h00
  2. [son]paramètre "len" de la fonction callback.
    Par troumad dans le forum SDL
    Réponses: 6
    Dernier message: 08/12/2009, 11h31
  3. Réponses: 4
    Dernier message: 15/10/2007, 18h56
  4. ecrire son OS (assembleur ??)
    Par Anonymous dans le forum Programmation d'OS
    Réponses: 9
    Dernier message: 25/11/2002, 19h25

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