Почему частота моих полученных веб-сокетов иногда равна нулю? - PullRequest
0 голосов
/ 09 декабря 2018

Я получаю сообщения websocket на своей веб-странице, и я пытаюсь вычислить частоту, с которой они принимаются.Я делаю это так:

let startTime = new Date();
            ws.onmessage = function (evt)
                {

                prevData = recivedData;
                var receivedMsg = evt.data;

                recivedData = JSON.parse(receivedMsg);

                const endTime = new Date();
                const timeDif = endTime - startTime;
                startTime = endTime;
                console.log(timeDif)
                }

Когда я смотрю на консоль, чтобы увидеть, что она напечатала, я вижу, что частота составляет в основном около 60 мс (как и ожидалось).Хотя, каждый четвертый раз или около того, это будет 0 мс, я нахожу это маловероятным и не могу найти причину.Есть идеи, как решить эту проблему?

1 Ответ

0 голосов
/ 09 декабря 2018
ws.onmessage = async () => {
    const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
    await wait(50); // await between executions
    // do your code 
}

Обновление:

См. Этот пример кода ниже.Вы сказали, что у вас есть функция цикла.Может быть, вам будет полезно, если у вас есть доступ к очереди событий каждый цикл, и вы никогда не имеете более одного события в очереди.

let done = false;

setTimeout(() => {
  done = true
}, 5);

const eventLoopQueue = () => {
  return new Promise(resolve => 
    setImmediate(() => {
      console.log('event loop');
      resolve();
    })
  );
}

const run = async () => {
  while (!done) {
    console.log('loop');
    await eventLoopQueue();
  }
}

run().then(() => console.log('Done'));

Что происходит здесь.Вы вызываете функцию eventLoopQueue () каждый цикл.Эта функция выдвигает обратный вызов в очередь с помощью setImmidiate ().Обратный вызов выполняется сразу же, и все, что находится в очереди, также будет выполнено.Таким образом, каждый цикл вы очищаете очередь.И я верю, что это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...