inkShio
@inkShio

Как отправлять запрос каждые N секунд, пока в ответ не получу нужный статус?

Форма отправляет все на search.php получаю id, этот id отправляю в status.php. В ответ получаю

{
    "search_ready": false
}

И вот мне надо сделать, чтобы запрос на проверку статуса отправлялся каждые 5 сек, на проверку статуса, пока не получу "search_ready": true. Не могу сообразить как. Подскажите в какую сторону копать.

document.addEventListener("DOMContentLoaded", () => {
  if (document.querySelector("#word")) {
    const forms = document.querySelectorAll("#word");

    forms.forEach((form) => {
      form.addEventListener("submit", function (e) {
        e.preventDefault();
        const formData = new FormData(this);

        fetch('search.php', {
          method: 'POST',
          body: formData
        })
        .then(res => res.json())
        .then(search => fetch('status.php', {
            method: 'POST',
            body: JSON.stringify(search)
          })
        )
        .then(res => res.json())
        .then(status => {
          console.log(status);
        })
        // и т.д.
      });
    });
  }
});
  • Вопрос задан
  • 485 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Асинхронная функция, внутри бесконечный цикл, в цикле запрос. Если результат запроса нас устраивает - выходим из цикла. Задержка между итерациями цикла реализуется с помощью промиса, который резолвится по таймауту.

async function() {
  let result = null;

  while (1) {
    result = await fetch(...);

    if (result тот, который нужен) {
      break;
    }

    await new Promise(r => setTimeout(r, 5000));
  }

  return result;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
setInterval / clearInterval
Ответ написан
@historydev Куратор тега JavaScript
Острая аллергия на анимешников
const interval = setInterval(() => {
fetch('search.php', {
          method: 'POST',
          body: formData
        })
        .then(res => res.json())
        .then(search => fetch('status.php', {
            method: 'POST',
            body: JSON.stringify(search)
          })
        )
        .then(res => res.json())
        .then(status => {
if(status === 200) clearInterval(interval)
          console.log(status);
        })
}, 300);
Ответ написан
@rPman
Настоятельно рекомендую такие задачи решать не через периодические опросы сервера, а через отсылку сервером сообщения ровно в момент окончания работы с помощью websocket (придется на сервере реализовывать или искать поддержку websocket, это не сложно, просто немного перевернет подход к разработке)

Например, на стороне бакэнда нужно будет запустить минимальный websocket сервер и http сервер (для коммуникации между бакэндами, так проще), который будет принимать http сообщения от основного бакэнда об изменениях в статусе и держать подключения от клиентов, выдавая в них изменения по статусам.

Недостаток подхода с периодическим опросом как у тебя - сильно растет нагрузка на бакэнд с ростом клиентов и лаг в реагировании на серверные события (в попытке уменьшить этот лаг будешь уменьшать интервал опроса и тем самым повышать нагрузку на бакэнд)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы