이 답변은 readdirSync
또는 과 같은 차단 기능을 사용하지 않습니다 statSync
. 외부 의존성을 사용하지 않으며 콜백 지옥의 깊이에서 스스로를 찾지 않습니다.
대신 약속 및 async-await
구문 과 같은 최신 JavaScript 편의를 사용 합니다. 그리고 비동기 결과는 병렬로 처리됩니다. 순차적으로-
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
위에서 사용한 모듈은 유사한 문제를 해결하기위한 함수의 세트로부터 추출 된 패턴이었다. 자세한 설명은 관련 Q & A를 참조하십시오 .
require('path').resolve(__dirname, file)