Как проверить fetch на успех?

Подскажите в чем может быть проблема.

Хочу сделать интервал на получаение данных, но если статус ответа не равен 200, тогда останавливаю интервал и создаю новый только через 30 секунд.

Код ниже не работает.

let getCurrent = () => {
  fetch('https://radio.mcm.fm/')
    .then(function(res) {
      if (res.status !== 200) {
        clearInterval(timerId)
        setTimeout(() => {
          const timerId = setInterval(() => {
            getCurrent()
          }, 3000)
        }, 30000)
        return
      }
    })
    .then(res => {
      this.props.importCurrentSong(res.current_track)
    })
    .catch(function(err) {
      console.log('Fetch Error :-S', err);
    });
}

const timerId = setInterval(() => {
  getCurrent()
}, 3000)


Ответы (1 шт):

Автор решения: nörbörnën

На самом деле тут не нужен setInterval, удобнее в обработчике каждого запроса устанавливать отложенный таймер на следующий запрос:

let getCurrent = () => {
  console.log(`connecting... ${new Date().toISOString()}`);
  const controller = new AbortController();
  const timeoutId = setTimeout(() => controller.abort(), 5000);
  fetch('https://radio.mcm.fm/', { signal: controller.signal })
    .then((res) => {
      if (res.status === 200) {
        return res.json();
      } else {
        return Promise.reject('something wrong');
      }
    })
    .then((res) => {
      console.log('ok');
      setTimeout(getCurrent, 3000);
      this.props.importCurrentSong(res.current_track);
    })
    .catch((err) => {
      console.log('fail');
      setTimeout(getCurrent, 25000);
    });
}

getCurrent();

→ Ссылка