为什么我收到的网络套接字的频率有时等于零?

时间:2018-12-08 23:48:33

标签: javascript time websocket

我正在网页上接收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 :(得分:0)

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()将回调推送到队列。回调将立即执行,队列中的所有内容也将被执行。因此,每个周期您都要清理队列。而且我相信它将为您提供帮助。