gpt4 book ai didi

javascript - Websockets onMessage 函数 : What happens if the code block within onMessage takes longer to run than interval between two messages?

转载 作者:行者123 更新时间:2023-11-30 19:03:11 28 4
gpt4 key购买 nike

作为 websocket 客户端,我们可以访问 onMessage 函数,该函数在客户端每次从服务器接收到消息时都会触发。我试图了解如果在 onMessage 事件上调用的代码块需要更长的时间来运行接收到的下一条消息之间的间隔,会发生什么情况。

例如,我测试了下面的代码:

client.onMessage = (event) => {
console.log('Message Received')
setTimeout(() => console.log('Delay of 10 seconds'), 10000)
}

我得到的输出很奇怪:

Message Received
Message Received
Message Received
Message Received
Message Received
Message Received
Message Received
Message Received
Message Received
Message Received
Message Received
Message Received
Delay of 10 seconds
Message Received
Delay of 10 seconds
Delay of 10 seconds
Delay of 10 seconds
Message Received
Delay of 10 seconds
Delay of 10 seconds
Message Received
Delay of 10 seconds
Delay of 10 seconds
Delay of 10 seconds
Message Received
Delay of 10 seconds
Message Received
Message Received
Message Received
Message Received
Message Received
Delay of 10 seconds
Message Received

有人知道这里发生了什么吗?

相关说明,如果 block 中调用的函数是如下所示的异步函数,会发生什么情况?

client.onMessage = async(event) => {
console.log('Message Received')
await setTimeout(() => console.log('Delay of 10 seconds'), 10000)
}

这是否会继续执行并将 console.log 添加到异步队列的末尾,直到内存已满并出现缓冲区错误?

感谢您的见解! :)

最佳答案

setTimeout 不会阻塞。您似乎在前 10 秒内收到了很多消息。许多 onMessage 回调会立即运行,许多 future setTimeout 回调会排队,但第一个 setTimeout 回调只会10 秒后开始运行。

On a related note, what happens if the function called within the block is an async function like below?

Nothing - async 函数也不会阻塞。 awaitsetTimeout 不会执行任何操作,因为 setTimeout 返回一个数字,而不是 Promise。

即使 setTimeout 返回一个 Promise,Promise 仍然不会阻塞,所以情况是一样的。

Would this just keep executing and adding console.log's to the end of the async queue until memory was full and it gave a buffer error?

如果您有实际的阻塞代码,这只会是一个风险,例如:

client.onMessage = (event) => {
const now = Date.now();
console.log('Message Received')
while (Date.now() - now < 10000);
console.log('Delay of 10 seconds');
}

在这里,最终(可能需要很长时间),机器内存无法处理的事件太多,脚本会失败。但如此昂贵的阻塞代码很少见,而且通常表明逻辑中存在问题,因此在几乎任何理智的情况下都无需担心。

关于javascript - Websockets onMessage 函数 : What happens if the code block within onMessage takes longer to run than interval between two messages?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59281010/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com