@danilr

Как прервать js запрос к серверу?

Происходит запрос через стороннюю библиотеку к API, но какие то запросы просто зависают и node js часами может ждать ответ запроса, но он так и не приходит и ошибок никаких не возникает.
Как сбросить этот запрос и продолжить выполнение js скрипта если в течении 3 минут не получен ответ? Запросы делаются в цикле.

for (let i=0; i < 300; i++) {
     
      try {
        const timerId = setTimeout(() => {
          console.log('in setTimeout continue');
          continue;
        }, 1000 * 60 * 3);
        await Order(i); // то самое стороннее апи
      }
      catch(e) {
        console.log('error_text:', e)
      }
      finally{
        clearTimeout(timerId);
      }
    }

так пробовал через setTimout делать continue для продолжения цикла. Правильно ли и сработает ли? Или есть более лучший вариант?
  • Вопрос задан
  • 375 просмотров
Решения вопроса 1
@danilr Автор вопроса
Promise.any не поддерживается в nodejs 12, поэтому решение через Promise.race:
let timerId = 0; // вынес так как не знал как таймаут потом в каждой итерации сбрасывать

      try {

        const firstPromiseResult = await Promise.race([
          new Promise((resolve) => {
            timerId = setTimeout(()=> {
              resolve('TIMEOUT')
            }, 1000 * 60 * 4) // время через которое мы идём дальше по циклу( тут его не видно(цикла))
          }),
          order(Id) // наш запрос к стороннему апи, тут без await т.к. зависает и проблема остаётся
        ]);

      }
      catch(e) {
        console.log('error_text:', e)
      }
      finally{
        clearTimeout(timerId); // сбрасываем таймаут в любом случае, чтобы не перегружать систему
      }
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
По-хорошему суметь настроить веб-запросер в той библиотеке, указав ему таймаут веб-соединения.

Можно через Promise.any() ждать, что выполнится раньше: запрос или таймаут.

Что-то типа
const TIMEOUT = "TIMEOUT";

for (let i=0; i < 300; i++) {
  await Promise.any([
    Order(i), // то самое стороннее апи
    new Promise((resolve) => setTimeout(() => resolve(TIMEOUT), 3 * 6e4))
  ])
  .then((result) => {
    if (result === TIMEOUT) {
      console.log(TIMEOUT);
    } else {
      console.log("Order fulfilled");
    }
  })
}

Тут ещё видимо надо ловить catch() в цепочке Order(), и далее ресолвить со значением ошибки, т.к. reject'нутные промисы не влияют на исход Promise.any(), если только вообще все участники откажутся
Ответ написан
Ваш ответ на вопрос

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

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