@alexmoran

Массив Promise обработка исключений?

Добрый день.
Есть массив промисов, необходимо их выполнить параллельно(асинхронно). Как это можно сделать?
let arr = [new Promise[pending],new Promise[pending],new Promise[pending]
Одно из решений которое я нашел это Promise.All([arr]). Но некоторые обещания выполняются с reject, а Promise.All срабатывает если обещания резолв.
Например у меня есть массив Promise из
const cmd = require('node-cmd-promise');
let promisesArray = []
let array = ['google.ru', 'yandex.ru', 'habrahabr.ru', 'yana.ru']
for (let i = 0;i < array.length; ++i) {
    promisesArray.push(cmd(`ping ${array[i]}`));

}
console.log(promisesArray)
Promise.all(promisesArray).catch((error) => console.log(error)).then(results => console.log(results))


но он может не сработать так как один из промисов даст reject если адрес не пингуется.
Как заставить сработать все обещания, а те которые не сработали обработать в catch?
  • Вопрос задан
  • 584 просмотра
Пригласить эксперта
Ответы на вопрос 1
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Недавно делал что-то подобное. Как-то так:

const cmd = require('node-cmd-promise');

const array = ['google.ru', 'yandex.ru', 'habrahabr.ru', 'yana.ru']

const promisesArray = array.map((url) => {
    return cmd(`ping ${array[i]}`)
        .then((pingResult) => Promise.resolve(pingResult))
        .catch(error => {
            console.error(error);
            return Promise.resolve(null);
        })
});

Promise.all(promisesArray).then((result) => {
    const finished = result.filter(result => result !== null);
    console.log('succesfully pinged: ', finished);
})


Идея в том, чтобы перехватить реджекнутый промиз и вместо него вернуть Promise.resolve с каким-то значением.

Возможно, есть какой-то более изящный вариант, но я так и не додумался.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы