Вы задали связанный вопрос пару дней назад, с которым я пытался вам помочь, но вы так и не ответили: (
Я ответил на похожие вопросы ( здесь и здесь ), которые обобщили этот шаблон -
const Parallel = p =>
( { map: async f =>
Promise .all ((await p) .map (x => f (x)))
, filter: async f =>
Promise .all ((await p) .filter (x => f (x)))
, flatMap: async f =>
Promise .all ((await p) .map (x => f (x))) .then (ys => [] .concat (...ys))
, // ...
}
)
Вы можете увидеть, как он используется таким образом с files
, который рекурсивно перечисляет все пути ко всем файлам в каталоге и его подкаталогах -
const { readdir, stat } =
require ("fs") .promises
const { join } =
require ("path")
const files = async (path = ".") =>
(await stat (path)) .isDirectory ()
? Parallel (readdir (path))
.flatMap (f => files (join (path, f)))
: [ path ]
И специализация search
, которая возвращает все пути, соответствующие запросу -
const { basename } =
require ("path")
const search = async (query, path = ".") =>
Parallel (files (path))
.filter (f => basename (f) === query)
И readPackages
, который рекурсивно читает все package.json
файлы по указанному пути -
const { readFile } =
require ("fs") .promises
const readPackages = async (path = ".") =>
Parallel (search ("package.json", path))
.map (readFile)
.then
( buffers =>
buffers .map (b => JSON .parse (String (b)))
)
Наконец, чуть более сложный пример, dirs
, который работает как files
, но рекурсивно перечисляет только каталоги. Уровень рекурсии можно контролировать с помощью параметра depth
-
const dirs = async (path = ".", depth = Infinity) =>
(await stat (path)) .isDirectory ()
? depth === -1
? []
: Parallel (readdir (path))
.flatMap (f => dirs (join (path, f), depth - 1))
.then (results => [ path, ...results ])
: []
Чтобы увидеть, как эти программы выглядят без модуля Parallel
, см. Связанные вопросы и ответы выше.