Отправить сообщение и ждать ответа

Как я не хотел работать с javascript, но пришлось.

Вопрос к знатокам: есть ли возможность отправить запрос (кастомный, из paho js клиента через mqtt), а потом дожидаться ответа (ответ тоже является сообщением mqtt-протокола)? Вопрос даже не касается, как такового протокола mqtt. В общем, есть ли решение для javascript узнавать сработала та или иная функция или произошло то или иное событие с учетом времени начала работы функции?

Логика

  1. Отправляю сообщение от клиента No1
  2. Запускаю таймер
  3. Жду 5 сек
  4. Если пришло обратное сообщение от клиента No2, то вывожу ok
  5. Если не пришло обратное сообщение от клиента No2, то not ok

В любом случае приложу, то чем сейчас пользуюсь

На данный момент имею полностью рабочего клиента paho js. Соответственно, отправка и прием сообщений возможны в любых видах, но использую JSON.

Что имеем

функция для подключения к mqtt-брокеру

'onConnect': function() {
  websocketclient.connected = true;
  this.subscribe(websocketclient.mac);
  console.log("Connected!");
  setInterval(function() {
    websocketclient.render.connectionPing();
  }, 30000);
},

и функция для отправки pinga другому клиенту

'connectionPing': async function() {
  let mes = {
    ["connected"]: 1
  }
  websocketclient.publish(websocketclient.mac + "/command", mes);
},

из кода видно, что я отправляю каждые 30 сек запрос. И после отправки запроса я и хочу проверять получил ли я обратное сообщение в течении 5 сек или нет. Это возможно?


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

Автор решения: Leonid

Для контроля за временем выполнения процессов принято вызывать performance.now() и сравнивать результат then - now. Результат измеряется в миллисекундах, но с гораздо бОльшей точностью нежели вызов: new Date()

let image = new Image();
let time = performance.now();
image.src = "https://image.freepik.com/free-vector/gradient-grainy-gradient-shape-set_23-2148971570.jpg";
image.onload = () => {
  document.body.append(image);
  let time_passed = performance.now() - time;
  console.log("Time passed: " + time_passed); 
  console.log("Less than 5sec?: " + !!(time_passed < 5000));
}

Или вызвать функцию setTimeout, ожидающую какое-то время и устанавливающую флаг time_is_over = true, который определяет стоит ли выполнять какие-то действия после прихода опоздавшего ответа. Если сообщение пришло раньше, то clearTimeout.

let image = new Image();
image.src = "https://image.freepik.com/free-photo/person-putting-medical-mask-earth_23-2148984685.jpg";
    
const TIME_TO_WAIT = 5000;
let time_is_over = false;

let waiting = setTimeout(() => {
    sendMessage('not ok');
    time_is_over = true;    
}, TIME_TO_WAIT)

image.onload = () => {
    if(!time_is_over){
        clearTimeout(waiting);
        sendMessage('ok');
        document.body.append(image);
    }
}

function sendMessage(message){
  console.log(message);
}

Здесь заведомо меньшее время на загрузку изображения:

let image = new Image();
image.src = "https://image.freepik.com/free-photo/person-putting-medical-mask-earth_23-2148984685.jpg";
    
const TIME_TO_WAIT = 50; // ЗДЕСЬ!!
let time_is_over = false;

let waiting = setTimeout(() => {
    sendMessage('not ok');
    time_is_over = true;    
}, TIME_TO_WAIT)

image.onload = () => {
    if(!time_is_over){
        clearTimeout(waiting);
        sendMessage('ok');
        document.body.append(image);
    }
}

function sendMessage(message){
    console.log(message);
}

→ Ссылка