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

NodeJS Discussion :

Node.js et setInterval et boucle


Sujet :

NodeJS

  1. #1
    agh
    agh est déconnecté
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 51
    Points : 49
    Points
    49
    Par défaut Node.js et setInterval et boucle
    Bonjour à tous,

    Je m'arrache les cheveux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for (var i = 0 ; i < 3 ; i++)
    {
            setInterval (function ()
            {
                toto(i) ;
            } , 1000) ;
    }
     
    function toto (i)
    {
         console.log (i) ;
    }


    Voilà un code tout bête... Qui selon ma logique devrait afficher :
    toutes les secondes...
    Or, ça m'affiche :
    toutes les secondes.

    Je vois d'où vient le problème :

    La boucle est d'abord parcourue en entier, jusqu'à ce que i=3.
    Puis, le setInterval est fait (avec un i=3)...
    MAIS ? Comment faire pour avoir le comportement attendu ?

    Je vous remercie beaucoup
    Alexis
    ----------
    Delphi 7 Perso [FR]
    Windows XP Pro [FR]

  2. #2
    Invité
    Invité(e)
    Par défaut
    En faisant un wrapper appelé immédiatement pour mémoriser l'index

    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
    for (var i = 0 ; i < 3 ; i++)
    {
        (function(i)
        {
            setInterval (function ()
            {
                toto(i) ;
            } , 1000) ;
        })(i);
    }
     
    function toto (i)
    {
        console.log (i) ;
    }
    D'ailleurs je trouve ça plus lisible comme suit, mais bon, question de goût^^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for (var i = 0; i < 3; i++) {
      (function(i) {
        setInterval(function() {
          toto(i);
        }, 1000);
      })(i);
    }
     
    function toto(i) {
      console.log(i);
    }

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 311
    Points : 545
    Points
    545
    Par défaut
    Salut agh !

    Enerian a très bien répondu à ta question. Toutefois si ton but est de trouver le meilleur moyen de repartir la charge CPU dans un même processus Node, je te conseille d’utiliser process.nextTick à la place de setInterval ou d’utiliser la fonction eachLimit du célèbre module async .
    ShaderElement : Bénéficier de l’accélération graphique simplement par une nouvelle balise HTML <shader>
    ODE.js : portage JavaScript du célèbre moteur physique 3D Open Dynamics Engine

  4. #4
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    C'est un problème récurrent en javascript.
    En effet, i dans la fonction anonyme de setInterval ne sera évalué que lorsque celle-ci sera appelée.
    Donc, lors de l'appel de cette fonction (au bout d'une seconde en l'occurrence), i vaudra déjà son max (2 en l'occurrence).
    Pour avoir le comportement voulu, il faut "enfermer" la variable i au moment de son inclusion dans la fonction anonyme. Comme ci-dessus, ou de cette façon en utilisant un "créateur" de fonction qui "ferme" le scope à chaque tour de boucle :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for (var i = 0 ; i < 3 ; i++){
      setInterval(creerToto(i), 1000);
    }
     
    function creerToto(i) {
      return function() { toto(i); };
    }
     
    function toto (i) {
      console.log (i) ;
    }

    Mais pourquoi mettre le setInterval dans la boucle ? Je ferais plutôt le contraire !
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    setInterval(function() {
      for (var i = 0 ; i < 3 ; i++){
        console.log(i);
      }
    }, 1000);

    edit : j'avais zapé Node. +1 @p3ga5e

  5. #5
    agh
    agh est déconnecté
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 51
    Points : 49
    Points
    49
    Par défaut
    Merci beaucoup pour vos réponses !
    Alexis
    ----------
    Delphi 7 Perso [FR]
    Windows XP Pro [FR]

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

Discussions similaires

  1. Actualiser l'heure avec Moment / Node, setInterval
    Par lostsoul dans le forum NodeJS
    Réponses: 6
    Dernier message: 23/05/2015, 09h44
  2. Un setInterval dans une boucle for
    Par maestro982 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/09/2014, 11h50
  3. lire en boucle une animation en jquery+setInterval.
    Par mouktar dans le forum jQuery
    Réponses: 1
    Dernier message: 25/06/2011, 10h49
  4. setInterval et la boucle for
    Par majedz dans le forum Flash
    Réponses: 1
    Dernier message: 10/02/2011, 02h14
  5. Réponses: 2
    Dernier message: 29/05/2002, 20h43

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