La callback opcional no se llama en el método forEachOf del módulo asíncrono node.js

Estoy usando el método forEachOf del módulo async para imprimir el resultado final después de iterar a través de un objeto. Aquí hay una versión abreviada de lo que estoy haciendo:

var async = require('async'), cheerio = require('cheerio'), request = require('request'); var returnArray = []; async.forEachOf(myObj, function (value, key, callback) { var anotherObj = {}; anotherObj.type = "val1"; request(someurl, function(err, res, body) { if (err) { return callback(err); } var $ = cheerio.load(body); anotherObj.name = "val2"; var miniObj = {}; $('#some-element', "#an-id").each(function(i, value) { var val = value.value; miniObj[size] = val; }); anotherObj.miniObj = miniObj; returnArray.push(anotherObj); return callback(); }); }, function (err) { if (err) { console.error(err.message); } console.log(returnArray); }); 

Sin embargo, cuando ejecuto el progtwig, nada (a saber, ‘returnArray’) se imprime en la consola como debería ser.

Para referencia, he visto estas otras publicaciones similares:

  • Usar un módulo asíncrono para activar una callback una vez que se leen todos los archivos (parece desactualizado, está utilizando el método incorrecto y no soluciona el problema)
  • La última callback no se llama mediante async (no soluciona el problema)

No estoy seguro de lo que estoy haciendo mal aquí. ¿Podría alguien por favor señalar lo que estoy haciendo mal?

¡Gracias!

EDIT: Así que creo que finalmente me di cuenta de lo que estaba haciendo mal. En un ejemplo diferente que proporcioné AQUÍ anteriormente , utilizando Runnable olvidé agregar una statement de ‘devolución de callback ()’. Entonces funcionó. La única diferencia entre eso y este ejemplo es que mi statement ‘return callback ()’ en el ejemplo proporcionado anteriormente se llama a sí misma dentro de otro método asíncrono. Creo que para solucionar mi problema, de alguna manera tendré que asegurarme (probablemente usando alguna función de flujo de control en la biblioteca de async) para llamar a ‘return callback ()’ en el ‘scope / nivel’ correcto después de que el segundo método asíncrono haya terminado. Creo que atribuiré esto, mi error, a la falta de documentación sobre el uso adecuado de la statement de ‘devolución de callback ()’ en los documentos asíncronos. Actualizaré este post con una solución una vez que lo descubra (y me scope un poco de sueño).

Su statement:

 if (err) { return callback(err); } 

No es válido para la progtwigción asíncrona. En su lugar, debe hacer:

 if(err) callback(err); 

Esta es la razón por la que no se te devuelve nada. Reescribí su código con conceptos asíncronos aplicados:

 var async = require('async'), var cheerio = require('cheerio'), var request = require('request'); var returnArray = []; async.forEachOf(myObj, function (value, key, next) { var anotherObj = {}; anotherObj.type = "val1"; request(someurl, function(err, res, body) { if (err) next(err); var $ = cheerio.load(body); anotherObj.name = "val2"; var miniObj = {}; async.each($('#some-element', "#an-id"), function (value, next) { var val = value.value; miniObj[size] = val; }); anotherObj.miniObj = miniObj; returnArray.push(anotherObj); next(); }); }, function (err) { if (err) console.error(err.message); console.log(returnArray); callback(returnArray); }); 

Observe que tiene dos devoluciones de llamada con nombre diferentes. La función externa de callback se llama callback . La función interna de callback se llama a next .