¿Hay un ejemplo de uso de la biblioteca de promesa Q sin procesar con nodo para atravesar un directorio de forma recursiva de forma asíncrona?

Estoy al tanto de io-q, la biblioteca que hace IO asíncrona que resulta en promesas. Pero estoy buscando un ejemplo simple del uso de la biblioteca Q para recorrer de forma recursiva una estructura de directorios, donde el resultado final es una lista de todos los archivos en todos los directorios que comienzan en la carpeta provista a alguna función, pero aplanados en el proceso a una sola matriz de nombres de archivos.

¿Hay un ejemplo de esto por ahí? O tal vez hay un ejemplo que no es recursivo, lo cual está bien. Supongo que esto es bastante simple, pero esta es mi primera exposición a async / promises.

Encontré esta idea que hace lo que quieres y es fácil de prometer:

var Q = require('q'), fs = require('fs'), p = require('path'); function readDir(path) { return Q.nfcall(fs.lstat, path).then(function(stat) { if (stat.isDirectory()) { return Q.nfcall(fs.readdir, path).then(function(files) { return Q.all(files // .map(p.join.bind(p, path)).map(readDir) .map(function(file) { return readDir(p.join(path, file)); }) ).then( // Function.apply.bind(Array.prototype.concat, []) function(results) { return [].concat.apply([], results); }); }); } else { return [path]; } }); } 

Utiliza nfcall para obtener promesas para la API del sistema de archivos y Q.all para esperar todos los resultados del subdirectorio antes de concatenarlos.

Bueno, esta es la solución a la que finalmente llegué (CoffeeScript). No soy un experto en Node o Q, así que supongo que esto servirá por ahora. Mi solución en realidad aplana la lista, y la forma de eliminar los directorios de la salida es eliminar .then() después de la read(f) .

 Q = require('q') fs = require('fs') _ = require("lodash") isFile = (name) -> fs.statSync(name).isFile() withDir = (dir) -> (files) -> _.map(files, (f) -> "#{dir}/#{f}") read = (dir) -> Q.nfcall(fs.readdir, dir) .then(withDir dir) .then((files) -> Q.all(toPromises files)) toPromises = (files) -> for f in files if isFile f then Q(f) else read(f).then((m) -> m.concat("d " + f)) read("my-root-dir") .then((files) -> _.flatten(files)) .then((r) -> console.log r) 

La función listTree de Q-IO hace exactamente lo que está buscando, por lo que puede echar un vistazo a la implementación .