讓我們先看看服務器端代碼。
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 秒,然后每個請求都會立即執行。
請解釋事件和 Async-Await 的這種性質。
謝謝 :)
uj5u.com熱心網友回復:
這是因為 Node.js 是異步的。
您在客戶端所做的是幾乎同時發送 100000 條訊息,因此 Node.js 服務器一一接收所有這些訊息,然后 Socket.io 呼叫您的回呼,在您的回呼中,您正在執行的操作sleep我認為只是一個包裝setTimeout,所以這個特定的回呼等待setTimeout被執行,但是當 Eventloop 發揮作用時,這個回呼等待setTimeout其他 JS 代碼被執行,所以所有這 100000 條訊息都被處理,并且每個回呼等待setTimeout. 因此,10 秒后setTimeout回呼將被 EventLoop 呼叫,然后您的代碼將被執行。
如果您習慣于使用例如 Java,它可能會讓您感到困惑,其中每個客戶端都有一個專用的行程/執行緒,因此sleep會阻止整個程序的執行。
您可以在此處閱讀有關事件回圈的更多資訊 https://nodejs.dev/learn/the-nodejs-event-loop
UPD:您可以通過console.log在呼叫sleep函式之前添加一個簡單的方法來查看實際呼叫回呼的時間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/344619.html
