Отправить сообщение и ждать ответа
Как я не хотел работать с javascript, но пришлось.
Вопрос к знатокам: есть ли возможность отправить запрос (кастомный, из paho js клиента через mqtt), а потом дожидаться ответа (ответ тоже является сообщением mqtt-протокола)? Вопрос даже не касается, как такового протокола mqtt. В общем, есть ли решение для javascript узнавать сработала та или иная функция или произошло то или иное событие с учетом времени начала работы функции?
Логика
- Отправляю сообщение от клиента No1
- Запускаю таймер
- Жду 5 сек
- Если пришло обратное сообщение от клиента No2, то вывожу
ok - Если не пришло обратное сообщение от клиента 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 шт):
Для контроля за временем выполнения процессов принято вызывать 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);
}