这个答案不使用像readdirSync
or之类的阻塞函数statSync
。它不使用外部依赖,也不会陷入回调地狱的深处。
相反,我们使用现代 JavaScript 便利,如 Promises 和 andasync-await
语法。并且异步结果是并行处理的;不是顺序的-
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)
)
: []
我将安装一个示例包,然后测试我们的功能 -
$ npm install ramda
$ node
让我们看看它的工作 -
> 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'
]
使用广义模块 ,Parallel
我们可以简化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 ])
: []
上面使用的Parallel
模块是从一组旨在解决类似问题的函数中提取的模式。有关更多说明,请参阅此相关问答。