async.each no itera al usar promesas

Estoy intentando ejecutar un bucle asíncrono async.each sobre una matriz de objetos. En cada objeto de la matriz, estoy tratando de ejecutar dos funciones secuencialmente (usando promises ). El problema es que async.each solo se ejecuta para la primera palabra clave.

En el siguiente código, getKeywords carga algunas palabras clave de un archivo y luego devuelve una matriz de objetos de palabras clave. Cada objeto de palabra clave se coloca en searchKeyword que realiza una búsqueda. El resultado de la búsqueda se coloca en una base de datos utilizando InsertSearchResults .

En mi opinión, cada palabra clave debe procesarse en paralelo y las funciones de búsqueda e inserción están vinculadas.

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

Solo está utilizando .then() devoluciones de llamada para que maneje el éxito.

Pero también debe agregar algunas devoluciones de llamada .catch() para manejar los errores.

Lo más probable es que obtengas errores que no se manejan y no pasa nada.

Por ejemplo:

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

Resulta que cometí un error en la función getKeywords. Estaba leyendo un archivo, luego iterando a través de cada línea usando un bucle for y empujando el resultado a una matriz. Esta matriz fue devuelta por la función.

async.each funcionaba perfectamente, pero solo recibía una serie de longitud 1 para iterar.

Solucioné este problema cambiando el bucle for a un 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); }); }); }); } 

Ayudar a escribir el problema, avisarme si debo eliminar la pregunta.

Gracias por su ayuda Mukesh Sharma y rsp.