Jawaban ini tidak menggunakan fungsi pemblokiran seperti readdirSync
atau statSync
. Itu tidak menggunakan dependensi eksternal atau menemukan dirinya di kedalaman neraka panggilan balik.
Alih-alih, kami menggunakan kenyamanan JavaScript modern seperti Janji dan async-await
sintaksis. Dan hasil asinkron diproses secara paralel; tidak secara berurutan -
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)
)
: []
Saya akan menginstal paket contoh, dan kemudian menguji fungsi kami -
$ npm install ramda
$ node
Mari kita lihat itu bekerja -
> 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'
]
Menggunakan modul umum Parallel
,, kita dapat menyederhanakan definisi 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 ])
: []
The Parallel
modul yang digunakan di atas adalah pola yang diekstraksi dari satu set fungsi yang dirancang untuk memecahkan masalah yang sama. Untuk penjelasan lebih lanjut, lihat Tanya Jawab terkait ini .
require('path').resolve(__dirname, file)