Diese Antwort verwendet keine Blockierungsfunktionen wie readdirSync
oder 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-await
Syntax. 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 Parallel
wir 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 Parallel
oben 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)