@formasters777

Собрать все ошибки error в массив и вернуть промис?

Собрал код из простого примера,
но немного запутался в промисах и axios ,
есть массив с ссылками, axios их перебирает,
те что отвечают я пушу в массив,
но те что не отвечают, ответ от них приходит после работы axios где-то через 30-40 секунд,
они приходят по ошибке error.request.
Сам объект Promise пока не использовал, т.к. сам axios возвращает объект на него схожий.
Каким образом в данном случае можно собрать все эти ошибки в .catch в массиве, например дождаться 10 ошибок, а после уже заходить в следующий .then?
Почитав о промисах, узнал что при использовании fetch, если промис ловит ошибку, тогда он идёт в error, а сам fetch продолжает обрабатывать запросы сам по себе.
Какой из вариантов может подойти:
1. Поставить таймер в catch на 60сек и забыть о проблеме.
2. Попробовать вернуть промис из .catch. Прочитав об error axios, то
error.request — это объект запроса HTTP, сделанного клиентом. Он содержит такую информацию, как метод HTTP, URL-адрес и заголовки, отправленные с запросом. Для Axios это экземпляр XMLHttpRequest при работе в браузере и экземпляр http.ClientRequest при выполнении в Node.js.

Это немного путает, возможно ли это вообще, и ошибки приходят не все сразу, а одна за другой.
Как понимаю браузер не знает сколько придёт этих ссылок.
3. Попробовать прицепить кол-во запросов и полученных ответов, сделать переменную,
а после в .catch сделать событие или счётчик, что пока не придёт нужное кол-во ошибок, не идти в следующий .then.
4. Городить огород с промис .allsettled и менять логику запросов.
5. Сделать обёртку axios.get на верхнем уровне и после цеплять к ней .then, и там уже считать что-то.
6. Не будет ли такого что, после получения одной ошибки в .catch, javascript полезет в следующий .then т.к. там событийный цикл event loop. Или обработать ошибки в then.

let array2 = [];
var i;
var number = 0;

for (i = 0; i < 214; i++) {
  axios.get(`url${i}`)
    .then((res) => {
      const $ = cheerio.load(res.data)
      $(".class").each((index, element) => {
         number++;
         const myData = $(element).find(".class").text().replace(/\s\s+/g, "")
         console.log(`${number}    ${myData}`)
         array2.push(myData);
         writeStream.write(`myData:     ${number}       ${myData}   \n`)
      })
    })
    .catch(function (error) {
      if (error.res) {
        // The request was made and the server responded with a status code
        // that falls out of the range of 2xx
        console.log("error.res")
      } else if (error.request) {
        // The request was made but no response was received
        // `error.request` is an instance of XMLHttpRequest in the browser and an instance of
        // http.ClientRequest in node.js
        console.log("error.request")
      } else {
        // Something happened in setting up the request that triggered an Error
        //console.log('Error', error.message);
        console.log("else")
      }
    }).then(function (resolve,reject) {
                  // code
})
}
  • Вопрос задан
  • 185 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Чтобы выполнить все запросы, и после получить массив по итогам, можно использовать метод Promise.allSettled() – передать в него массив промисов запросов Axios, и в следующий then() попадёт массив с результатами:
const batch = new Array(214)
  .fill()
  .map((_, i) => `https://example.com/api/${i}`) // URL запросов
  .map(url => axios.get(url));

Promise.allSettled(batch)
  .then(axiosResults => {
    const results = [];
    const errors = [];

    axiosResults.forEach(({ status, res }) => {
      if (status === 'fullfilled') {
        results.push(res);
      } else if (status === 'rejected') {
        errors.push(res);
      }
    });

    return { results, errors };
  })
  .then(({ results, errors }) => {
    console.log('Вот результаты: %o, а вот ошибки: %o', results, errors);
  });
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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