Пока ещё не уложилось в голове, поэтому буду подглядывать сюда при написании реального кода. Если надо выполнить промисы последовательно => строим цепочку промисов с помощью 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);
};