Câu trả lời này không sử dụng các chức năng chặn như readdirSync
hoặc statSync
. Nó không sử dụng các phụ thuộc bên ngoài và cũng không tìm thấy chính nó trong chiều sâu của địa ngục gọi lại.
Thay vào đó, chúng tôi sử dụng các tiện ích JavaScript hiện đại như Lời hứa và async-await
cú pháp. Và kết quả không đồng bộ được xử lý song song; không tuần tự -
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)
)
: []
Tôi sẽ cài đặt một gói ví dụ và sau đó kiểm tra chức năng của chúng tôi -
$ npm install ramda
$ node
Hãy xem nó hoạt động -
> 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'
]
Sử dụng một mô-đun tổng quát Parallel
, chúng ta có thể đơn giản hóa định nghĩa của 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 ])
: []
Các Parallel
module được sử dụng ở trên là một mô hình đã được chiết xuất từ một tập hợp các chức năng được thiết kế để giải quyết một vấn đề tương tự. Để giải thích thêm, hãy xem phần hỏi đáp liên quan này .
require('path').resolve(__dirname, file)