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 :

Fonctions asynchrones dans une boucle


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Par défaut Fonctions asynchrones dans une boucle
    Bonjour à tous,

    Je block sur un truc et fais donc appel à nos éminents habitants du forum :

    Je voudrais créer de manière asynchrone un array à partir d'un string :

    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
     
    arrMetamorph = function(str) {
        var newArr = {};
        arr = str.split(" ");
        arr.map(function(el){
            getTransformation(el, function(output){
                if(output){
                    if (typeof(newArr[output])=="undefined") {
                        newArr[output]=1;
                    }else{
                        newArr[output]+=1
                    }
                }
            });
        });
        console.log(JSON.stringify(newArr));
    }
     getTransformation = function(input,cb){
            setTimeout(function () {
                cb('"'+input+"'");
            }, 2000);
    }
     
    arrMetamorph('1 2 3 4 5')
    Normalement getTransformation tape dans une bdd

    Le résultat est {}. Quelqu'un pourrait-il me donner une astuce pour lancer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    console.log(JSON.stringify(newArr));
    un fois la boucle terminée ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Par défaut
    Il y a du mieux avec une promise mais je sèche toujours sur mon console.log final. Il quelque chose qui se rapproche à un then() appliqué à map non ?

    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
     
     
    arrMetamorph = function(str) {
        var newArr = {};
        arr = str.split(" ");
        arr.map(function(el){
            getTransformation(el).then(function(output){
            	console.log('sortie');
                if(output){
                    if (typeof(newArr[output])=="undefined") {
                        newArr[output]=1;
                    }else{
                        newArr[output]+=1
                    }
                }
                console.log(JSON.stringify(newArr))
            });
        });
    }
     function getTransformation(input){
     	return new Promise(function(resolve, reject){
      	console.log('entree');
        setTimeout(function () {
    		  resolve('"'+input+'"');
        }, 2000);
      });
    }
     
    arrMetamorph('a a a z z');
    PS : le code est testable sur jsfiddle

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Par défaut
    J'ai avancé sur le contrôle du console.log final mais maintenant mon output renvoi l'objet promise en entier... Pour il devrait renvoyer dans le next l'argument qui est dans resolve ?

    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
     
    arrMetamorph = function(str) {
        var newArr = {};
        arr = str.split(" ");
        arr.reduce(function(el){
            return getTransformation(el).then(function(output){
                console.log('sortie');
                if(output){
                    if (typeof(newArr[output])=="undefined") {
                        newArr[output]=1;
                    }else{
                        newArr[output]+=1
                    }
                }
            })
        },Promise.resolve()).then(function(){
                console.log(JSON.stringify(newArr));
        });
    }
     function getTransformation(input){
        return new Promise(function(resolve, reject){
        console.log('entree');
        setTimeout(function () {
              resolve('"'+input+'"');
        }, 2000);
      });
    }
     
    arrMetamorph('a a a z z');

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Par défaut
    Cette fois c'est la bonne pour ceux que ça intéresserait :

    Explication :
    https://developer.mozilla.org/fr/doc...x/Array/reduce

    Le premier arg du callback de reduce est la valeur précédente !

    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
     
     
    arrMetamorph = function(str) {
        var newArr = {};
        arr = str.split(" ");
        arr.reduce(function(prev,current){
            return getTransformation(current).then(function(output){
            	console.log('sortie');
                if(output){
                    if (typeof(newArr[output])=="undefined") {
                        newArr[output]=1;
                    }else{
                        newArr[output]+=1
                    }
                }
            })
        },Promise.resolve()).then(function(){
    			console.log(JSON.stringify(newArr));
        });
    }
     function getTransformation(input){
     	return new Promise(function(resolve, reject){
      	console.log('entree');
        setTimeout(function () {
    		  resolve('"'+input+'"');
        }, 2000);
      });
    }
     
    arrMetamorph('a a a z z');

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

Discussions similaires

  1. fonction mail dans une boucle while
    Par tjoce dans le forum Langage
    Réponses: 5
    Dernier message: 23/04/2010, 18h39
  2. vba fonction split dans une boucle
    Par mymoi dans le forum VBA Access
    Réponses: 6
    Dernier message: 26/05/2009, 10h17
  3. [MySQL] Fonction récursive dans une boucle
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 21/02/2008, 12h18
  4. la fonction SOMMEPROD dans une boucle dynamique
    Par Mounamidou dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/10/2007, 16h32
  5. Fonction system() dans une boucle for
    Par banban56 dans le forum C
    Réponses: 3
    Dernier message: 16/06/2007, 18h48

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