คำตอบนี้ไม่ได้ใช้การปิดกั้นการทำงานเช่นการหรือreaddirSync
statSync
มันไม่ได้ใช้การพึ่งพาจากภายนอกหรือค้นหาตัวเองในส่วนลึกของนรกโทรกลับ
แต่เราใช้สิ่งอำนวยความสะดวก JavaScript ที่ทันสมัยเช่นสัญญาและasync-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
โมดูลสินค้าด้านบนเป็นรูปแบบที่ถูกสกัดจากชุดของฟังก์ชั่นที่ออกแบบมาเพื่อแก้ปัญหาที่คล้ายกัน สำหรับคำอธิบายเพิ่มเติมโปรดดูคำถาม & คำตอบที่เกี่ยวข้อง
require('path').resolve(__dirname, file)