/
Блог
/
Дневник студента
/

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

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

12 октября 2021 г.
0 минут

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

Avshukan

4 года назад