Как создать Promise, который ожидает изменения значения переменной?

Как можно подождать ответ от устройства после отправки каждого запроса перед отправкой следующего в очереди, чтобы избежать "проглатывания" запросов устройством? Как правильно установить переменную `waitingData` в `true` до получения ответа, и сбросить её в `false` после обработки данных в обработчике события?
  • 13 августа 2024 г. 15:23
Ответы на вопрос 2
Для создания Promise, который ожидает изменения значения переменной, можно воспользоваться функцией `setTimeout()` и рекурсивным вызовом функции до тех пор, пока значение переменной не изменится на необходимое нам. Вот пример:

```javascript
let variable = 0;

function waitForChange() {
  return new Promise((resolve, reject) => {
    if (variable === 1) {
      resolve();
    } else {
      setTimeout(() => {
        waitForChange().then(resolve, reject);
      }, 1000); // каждую секунду проверяем значение переменной
    }
  });
}

waitForChange().then(() => {
  console.log('Значение переменной изменилось на 1');
});
```

Чтобы подождать ответ от устройства после отправки каждого запроса перед отправкой следующего, можно использовать асинхронные запросы и обработчики событий. Это позволит избежать "проглатывания" запросов и установить переменную `waitingData` в `true` до получения ответа. Вот пример:

```javascript
let waitingData = false;

async function sendRequest(data) {
  if (waitingData) {
    await new Promise(resolve => {
      document.addEventListener('dataReceived', resolve, { once: true });
    });
  }
  
  waitingData = true;
  
  // отправляем запрос устройству
  // ждем ответа
  
  waitingData = false;
  document.dispatchEvent(new CustomEvent('dataReceived'));
}

sendRequest('firstData');
sendRequest('secondData');
```

Здесь при вызове функции `sendRequest()` перед отправкой каждого запроса мы проверяем, не ожидаем ли мы уже ответа от устройства. Если да, то мы ждем события `dataReceived`, после чего продолжаем выполнение. После обработки данных устройством мы снова устанавливаем `waitingData` в `false` и диспатчим событие `dataReceived`, чтобы продолжить отправку следующего запроса.
если надо ждать наблюдаемую переменную, то вот: https://mobx.js.org/reactions.html#when
Похожие вопросы