首页 文章

为什么我收到的websockets的频率有时等于零?

提问于
浏览
0

我在我的网页上收到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
    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()将回调推送到队列 . 回调立即执行,队列中的任何内容也将被执行 . 所以每个周期都要清理队列 . 我相信它会对你有所帮助 .

相关问题