Промис на основе массива

Статья написана студентом Хекслета. Мнение автора может не совпадать с позицией редакции
Читать в полной версии →

Пока ещё не уложилось в голове, поэтому буду подглядывать сюда при написании реального кода. Если надо выполнить промисы последовательно => строим цепочку промисов с помощью reduce Если надо выполнить промисы одновременно => делаем массив промисов и с помощью map и применяем Promise.All

Создание цепочки промисов из массива:

const getTypes = (list) => list.reduce((result, path) => result
      .then((content) => fsp
          .stat(path)
          .then((data) => content.concat(
            data.isDirectory() ? 'directory'
              : data.isFile() ? 'file'
                : null)
          )
          .catch (() => content.concat(null))
      )
  , Promise.resolve([])
);

Promise.All Мой вариант:

const getBadLinks = async (url) => {
  const content = (await axios.get(url)).data;
  const allLinks = extractLinks(content);
  const badLinks = [];
  const promises = allLinks.map((link) => new Promise((resolve, reject) => {
      axios.get(link)
        .then((response) => {
          if (!response || response.status !== 200) {
            badLinks.push(link);
          };
          resolve();
        })
        .catch((e) => {
          badLinks.push(link);
          resolve();
        });
    })
  );
  await Promise.all(promises);
  return badLinks;
}

Шаблонный вариант:

export default async (initialLink) => {
  const response = await axios.get(initialLink);
  const links = extractLinks(response.data);
  const request = (link) => axios.get(link).then(() => null).catch(() => link);
  const promises = links.map(request);
  const results = await Promise.all(promises);
  return results.filter((result) => result !== null);
};