Js сделать последовательно несколько операций запрос-ответ

Просто для саморазвития! Как на js сделать последовательно несколько операций запрос-ответ, контроль отсутсвия ответа по таймауту? Почитал, делается на колбэках или промисах. Мне надо опрашивать устройства по 15 адресам, сервер по этому запросу опрашивает по радиоканалу другие устройства, ждет ответ и отсылает его клиенту. Не могу разобраться как это сделать на одной функции с промисом в цикле.
Здесь запрос на два устройства, на 15 будет не красиво…

<script>
      let Terr1 = 1,
        Terr2 = 1;
      function rec_err(id, params) {
        div = document.getElementById(id);
        div.innerText = params;
        div.className = "dv err";
        console.log("rec_err: ", params);
      }
      function rec_ok(id, params) {
        div = document.getElementById(id);
        div.innerText = params;
        div.className = "dv ok";
        console.log("rec_ok: ", params);
      }
      function rec_start(id, params) {
        div = document.getElementById(id);
        div.innerText = params;
        div.className = "dv start";
        console.log("rec_start: ", params);
      }

      function awq(t_err) {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            resolve("awq resolve");
          }, 2000);
          setTimeout(() => {
            reject("awq reject");
          }, t_err * 1000);
        });
      }
      function snd() {
        console.log("start");
        Terr1 = Number(document.getElementById("T1").value);
        Terr2 = Number(document.getElementById("T2").value);
        rec_start("s1", "---");
        rec_start("s2", "---");
        awq(Terr1)
          .then(
            (result) => {
              console.log("1 ok", result);
              rec_ok("s1", "ok1");
              return awq(Terr2); //
            },
            (e) => {
              console.log("1 end er", e);
              rec_err("s2", "er1");
              return awq(Terr2);
            }
          )
          .then(
            (result) => {
              console.log("2 ok", result);
              rec_ok("s2", "ok2");
            },
            (e) => {
              console.log("2 err", e);
              rec_err("s2", "er2");
            }
          );
      }
      setInterval(snd, 5000);
    </script>

какое отношение это имеет к этому форуму?
тем более, к разделу для новичков?

Ненуачё, как говорила известная Мышь:

«О собаках — пожалуйста. Самая светская беседа»

:slight_smile:

Сначала считаете самый первый запрос “текущим”.

  1. запускаете текущий запрос, назначив функции-обработчики ответа и таймаута;
  2. занимаетесь другими делами и про запросы пока забываете. Рано или поздно либо функция обработки ответа, либо функция обработки таймаута будет вызвана;
  3. в функции обработки ответа/таймаута делаете то, что она должна сделать, а потом смотрите есть ли ещё неотправленный запрос. Если есть то делаете его “текущим” и переходите к п.1

Собсна, всё. Вот так это и делается.

Спасибо, что выделили время. Как в общем делать, я примерно понимаю. Вопрос был больше по js, с ним только начал разбираться. Так как сейчас распространены esp и wifi, предполагал что подобные задачи стояли перед многими, вроде простой момент, крутить промис в цикле, только не получается:) Ладнать буду спрашивать у ии.

Так просто изучайте JS. Вот неплохой учебник с кучей примеров. Немного запутанно организован, но найти всё можно.

Уважаемый! Тебе ответили: следующий запрос не руками вписывать в then по ризалту, а поставить туда функцию переключающую текущий запрос на следующий.
Дальше либо рекурсия “в стиле JS” либо цикл. Рекурсия выглядит моднявее :wink:

Это делается через async/await и обычный цикл.