Partage
  • Partager sur Facebook
  • Partager sur Twitter

Javascript et callbacks

    23 juillet 2016 à 0:01:54

    Bonjour, j'aimerais savoir comment il est possible d'effectuer une boucle de callback.

    J'ai une fonction doSomething(callback) qui ne m'appartient pas et qui attends une callback. J'aimerais lancer cette fonction pour chaque élément d'une liste L et effectuer une action à la fin.

    Le code suivant ne marche évidemment pas :

    for(var i = 0; i < L.length; ++i)
    {
        doSomething(maCallBack);
    }
    monAction(); // Rien ne garantit que chaque "doSomething" ait été exécuté. Je dirais même qu'il y a peu de chance que ce soit le cas.

    Du coup, j'ai découvert ce pattern : http://www.richardrodger.com/2011/04/21/node-js-how-to-write-a-for-loop-with-callbacks/#.V5KO0DX4Z34. Il consiste en résumé à une fonction récursive qui effectuer "monAction()" au moment de la condition d'arrêt de la récursivité.

    Cependant, "doSomething()" est une fonction d'une bibliothèque tierce (google.analytics.data.ga.get pour être précis) qui prends une callback avec 3 paramètres (error, result, je_ne_sais_pas_quoi), je ne peux donc pas simplement ajouter des arguments pour utiliser ce pattern recursif :/.

    Comment puis-je m'en sortir ?

    Merci pour votre aide !

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      23 juillet 2016 à 12:34:30

      Quel est le rapport entre la fonction monAction() et ta boucle ?
      • Partager sur Facebook
      • Partager sur Twitter
        23 juillet 2016 à 13:02:56

        Concrêtement, ma boucle télécharge des données à chaque tour. monAction() consiste en une sauvegarde en base de données.

        Actuellement ma boucle est effectuée 4 fois. J'aimerais sauvegarder une base de donnée une seule fois, et uniquement lorsque toutes les données ont été téléchargées (donc que les 4 callback ont été exécutées).

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          23 juillet 2016 à 14:09:26

          Où se trouve la difficulté ?

          for(var i = 0; i < L.length; ++i)
          {
              doSomething(maCallBack);
          
              if ((i + 1) === L.length) {
                  monAction();
              }
          }



          • Partager sur Facebook
          • Partager sur Twitter
            23 juillet 2016 à 15:05:11

            Il s'agit d'un appel asynchrone. Ton code est équivalent à simplement :

            for(var i = 0; i < L.length; ++i)
                doSomething(maCallBack);
            monAction();

            Dans ce cas précis, monAction() est effectivement appelé une fois que tous les appels doSomething ont été fait.

            Néanmoins, si les appels sont effectués avant, rien n'indique que les callbacks ont fini leur travail (et il y a très peu de chance que ce soit le cas). monAction() ne doit être effectué qu'une fois que les tâches asynchrones déclenchées par les appels de doSomething() sont toutes terminées.

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              23 juillet 2016 à 15:37:38

              Ok je n'avais pas vu qu'il s'agissait d'un appel asynchrone et effectivement le code plus haut est similaire à celui que tu viens de mettre.

              Pour les traitements asynchrones il existe les 'promise'.

              • Partager sur Facebook
              • Partager sur Twitter
                23 juillet 2016 à 16:50:59

                Donc il faudrait qu'à chaque appel de doSomething je récupère une Promise, et qu'ensuite j'effectue monAction() lorsque toutes les tâches ont été effectuées ?
                • Partager sur Facebook
                • Partager sur Twitter
                  23 juillet 2016 à 18:31:00

                  Je n'ai rien dans ton exemple, simplement un éditeur de texte vide :/.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    23 juillet 2016 à 20:00:19

                    L'exemple est tiré du MDN de Mozilla : https://jsfiddle.net/ajf5p5aL/

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Javascript et callbacks

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown