Для создания 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`, чтобы продолжить отправку следующего запроса.