2017-01-10 1 views
0

J'essaie d'exécuter une boucle asynchrone async.each sur un tableau d'objets. Sur chaque objet de la matrice, j'essaie d'exécuter deux fonctions séquentiellement (en utilisant promises). Le problème est que async.each s'exécute uniquement pour le premier mot-clé.async.each ne pas itératif lors de l'utilisation des promesses

Dans le code suivant, getKeywords charge des mots-clés à partir d'un fichier, puis renvoie un tableau d'objets mot-clé. Chaque objet mot-clé est mis en searchKeyword qui effectue une recherche. Le résultat de la recherche est ensuite placé dans une base de données en utilisant InsertSearchResults. Dans mon esprit, chaque mot-clé doit être traité en parallèle et les fonctions de recherche et d'insertion sont liées.

getKeywords(keys).then(function(keywords) { 
    async.each(keywords, function(keywordObject, callback) { 
     searchKeyword(keywordObject).then(function(searchResults) { 
      return insertSearchResults(searchResults, db, collections); 
     }).then(function(result) { 
      console.log("here"); 
      callback(); 
     }) 
    }) 
}) 
+0

pouvez-vous essayer d'appeler le callback optionnel qui capture 'err'? –

Répondre

0

Vous utilisez uniquement les rappels .then() afin de gérer le succès.

Mais vous devez également ajouter des rappels .catch() pour gérer les erreurs. Il est fort probable que vous receviez des erreurs qui ne sont pas gérées et rien ne se passe.

Par exemple:

  // ... 
     }).then(function(result) { 
      console.log("here"); 
      callback(); 
     }).catch(function (error) { 
      console.log('Error:', error); 
      callback(error); 
     }); 
0

Il se trouve que je fait une erreur dans la fonction getKeywords. Je lisais à partir d'un fichier, puis iterais sur chaque ligne en utilisant une boucle for et en poussant le résultat vers un tableau. Ce tableau a ensuite été retourné par la fonction. Async.each fonctionnait parfaitement mais recevait seulement un tableau de longueur 1 pour itérer.

Je résolu ce problème en changeant la boucle à une boucle de async.each

function getKeywords(keywordsFilename){ 
    //get keywords from the file 
    return new Promise(function (resolve, reject) { 
     var keywords = []; 
     fs.readFile(keywordsFilename, function read(err, data) { 
      if (err) { 
       reject(err); 
      } 
      content = data.toString(); 
      var lines = content.split("\n"); 
      async.each(lines, function(line, callback) { 
       if (line[0] === "#" || line == "") { 
        callback(); 
       } 
       else { 
        keywords.push(extractKeyword(line)); 
        callback(); 
       } 
      }, function (err) { 
       resolve(keywords); 
      }); 
     }); 
    }); 
} 

La rédaction du problème à aidé, permettez-moi de savoir si je dois supprimer la question.

Merci pour votre aide Mukesh Sharma et rsp.