Собрал код из простого примера,
но немного запутался в промисах и 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
})
}