Diese Antwort verwendet keine Blockierungsfunktionen wie readdirSyncoder statSync. Es verwendet weder externe Abhängigkeiten noch befindet es sich in den Tiefen der Callback-Hölle.
Stattdessen verwenden wir moderne JavaScript-Funktionen wie Promises und async-awaitSyntax. Asynchrone Ergebnisse werden parallel verarbeitet. nicht nacheinander -
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)
)
: []
Ich werde ein Beispielpaket installieren und dann unsere Funktion testen -
$ npm install ramda
$ node
Mal sehen, wie es funktioniert -
> 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'
]
Mit einem verallgemeinerten Modul können Parallelwir die Definition von dirs- vereinfachen
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 ])
: []
Das Paralleloben verwendete Modul war ein Muster, das aus einer Reihe von Funktionen extrahiert wurde, um ein ähnliches Problem zu lösen. Weitere Erläuterungen finden Sie in den entsprechenden Fragen und Antworten .
require('path').resolve(__dirname, file)