Имя для функции, которая отображает и возвращает разрешенный массив обещаний? - PullRequest
1 голос
/ 20 мая 2019

Возможно, это глупый вопрос, но я недавно обнаружил, что часто использую эту абстракцию:

async function giveMeAName(cbAsync, initValue) {
  return await Promise.all(
    initValue.map(cbAsync),
  );
}

Вопрос: Это обычная задача для кого-то еще?Если так, у него есть имя?Если нет, может быть, это только отчасти осознает, так это напоминает вам что-нибудь?В противном случае я могу просто удалить вопрос.

В настоящее время я использую эту функцию для этого набора инструкций.Приведенный ниже код получит все каталоги пути и соберет все каталоги, в которых есть package.json:

const directories = (await getDirNamesByPath(rootPath));
const paths = await giveMeAName(addExistAdaptor, directories.map(joinPathWithName(rootPath)));
return await giveMeAName(collectJson, paths.filter(hasPath));

Ответы [ 3 ]

2 голосов
/ 20 мая 2019

Вы задали связанный вопрос пару дней назад, с которым я пытался вам помочь, но вы так и не ответили: (

Я ответил на похожие вопросы ( здесь и здесь ), которые обобщили этот шаблон -

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, см. Связанные вопросы и ответы выше.

0 голосов
/ 20 мая 2019

Возможно mapAll или awaitAll?

Bluebird имеет аналогичную функцию, просто называемую map(), которая делает что-то очень похожее (она возвращает сопоставленное обещание, а не разрешает его).

0 голосов
/ 20 мая 2019

Я использую разные названия для него, в зависимости от моих потребностей в приложении.Иногда я использую такие функции для конкретных случаев использования и называю их соответственно.Но самое общее имя, которое я использую довольно часто, это просто resolveAll().

Но я не думаю, что есть (полу) официальное название для него.Назовите его так, как он имеет для вас наибольшее значение.

...