2017-01-10 8 views
0

Ich versuche, eine asynchrone Schleife async.each über ein Array von Objekten auszuführen. Bei jedem Objekt im Array versuche ich zwei Funktionen nacheinander auszuführen (promises). Das Problem ist, dass async.each nur für das erste Schlüsselwort ausgeführt wird.async.each nicht iterieren bei Verwendung von Versprechen

Im folgenden Code lädt getKeywords einige Schlüsselwörter aus einer Datei und gibt dann ein Array von Schlüsselwortobjekten zurück. Jedes Schlüsselwortobjekt wird in searchKeyword eingefügt, das eine Suche durchführt. Das Suchergebnis wird dann unter Verwendung von InsertSearchResults in eine Datenbank eingegeben.

Meiner Meinung nach sollte jedes Schlüsselwort parallel verarbeitet werden und die Such- und Einfügefunktionen sind verknüpft.

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

können Sie versuchen, den optionalen Callback aufzurufen, der 'err' erfasst? –

Antwort

0

Sie verwenden nur Callbacks, damit Sie mit dem Erfolg umgehen können.

Aber Sie sollten auch einige .catch() Callbacks hinzufügen, um Fehler zu behandeln.

Höchstwahrscheinlich erhalten Sie Fehler, die nicht behandelt werden und nichts passiert.

Zum Beispiel:

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

Es stellt sich heraus, dass ich einen Fehler in der Funktion GetKeywords gemacht. Ich habe aus einer Datei gelesen, dann durch jede Zeile mit einer For-Schleife durchlaufen und das Ergebnis zu einem Array schieben. Dieses Array wurde dann von der Funktion zurückgegeben.

async.each funktionierte einwandfrei, erhielt aber immer nur ein Array der Länge 1, um darüber zu iterieren.

ich dieses Problem behoben, indem die for-Schleife zu einer async.each Schleife

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); 
      }); 
     }); 
    }); 
} 

Schreiben, das Problem geholfen zu ändern, lassen Sie mich wissen, ob ich die Frage löschen sollte.

Danke für Ihre Hilfe Mukesh Sharma und rsp.

Verwandte Themen