Cette réponse n'utilise pas de fonctions de blocage comme readdirSync
ou statSync
. Il n'utilise pas de dépendances externes et ne se retrouve pas dans les profondeurs de l'enfer de rappel.
Au lieu de cela, nous utilisons des fonctionnalités JavaScript modernes comme les promesses et les async-await
syntaxes. Et les résultats asynchrones sont traités en parallèle; pas séquentiellement -
const { readdir, stat } =
require ("fs") .promises
const { join } =
require ("path")
const dirs = async (path = ".") =>
(await stat (path)) .isDirectory ()
? Promise
.all
( (await readdir (path))
.map (p => dirs (join (path, p)))
)
.then
( results =>
[] .concat (path, ...results)
)
: []
Je vais installer un exemple de package, puis tester notre fonction -
$ npm install ramda
$ node
Voyons voir ça marche -
> dirs (".") .then (console.log, console.error)
[ '.'
, 'node_modules'
, 'node_modules/ramda'
, 'node_modules/ramda/dist'
, 'node_modules/ramda/es'
, 'node_modules/ramda/es/internal'
, 'node_modules/ramda/src'
, 'node_modules/ramda/src/internal'
]
En utilisant un module généralisé Parallel
, nous pouvons simplifier la définition de dirs
-
const Parallel =
require ("./Parallel")
const dirs = async (path = ".") =>
(await stat (path)) .isDirectory ()
? Parallel (readdir (path))
.flatMap (f => dirs (join (path, f)))
.then (results => [ path, ...results ])
: []
Le Parallel
module utilisé ci-dessus était un modèle extrait d'un ensemble de fonctions conçues pour résoudre un problème similaire. Pour plus d'explications, consultez ces questions et réponses connexes .
require('path').resolve(__dirname, file)