首页 > 解决方案 > Socket.io/Ws 事件无法正常工作

问题描述

让我们先看看服务器端代码。

io.on('connection', (socket) => {
     socket.on('message', async () =>{
     await sleep(10000); //This Function Takes 10s To Process
     console.log(++total)
  })
});

客户端

socket.on('connect', () => {
     console.log('connected!');
     for(var i=0;i < 100000; i++){
       socket.emit('message', 'room1');
     }
});

在这里,我试图向我的服务器发送垃圾邮件。现在每个请求应该花费 10 秒,但这里只有第一次 Emit 消耗 10 秒,然后每个请求都会立即执行。

请解释事件和异步等待的这种性质。

谢谢 :)

标签: node.jsasynchronousasync-awaitsocket.iows

解决方案


这是因为 Node.js 是异步的。

您在客户端所做的是几乎同时发送 100000 条消息,因此 Node.js 服务器会一一接收所有这些消息,并且 Socket.io 会调用您的回调,在您的回调中您正在做的事情sleep我假设只是一个Wrapped setTimeout,所以这个特定的回调等待setTimeout被执行,但是这里当 Eventloop 发挥作用时,这个等待setTimeout其他 JS 代码的回调被执行,所以这 100000 条消息都被处理了,每个回调都等待setTimeout. 因此,setTimeoutEventLoop 会在 10 秒后调用回调,然后执行您的代码。

如果您习惯于使用例如Java,它可能会让您感到困惑,其中每个客户端都有一个专用的进程/线程,因此sleep会阻止整个进程的执行。

您可以在此处阅读有关事件循环的更多信息 https://nodejs.dev/learn/the-nodejs-event-loop

console.logUPD:您可以通过在调用sleep函数之前添加一个简单的方法来查看实际调用回调的时间。


推荐阅读