- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为 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
函数也不会阻塞。 await
setTimeout
不会执行任何操作,因为 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/
我们有一些第三方代码,它们执行以下操作 列表项 创建用户交易,例如 txn = (UserTransaction)ctx.lookup( "UserTransaction" ); txn.begi
表达式 "a".(strlen('ab')-strlen('a')) 按预期计算为 a1。 但是如果我不小心省略了括号, "a".strlen('ab')-strlen('a') 计算结果为-1。这里
我读到了有关 Java 类型删除的内容 on Oracle's website . 什么时候发生类型删除?在编译时还是运行时?类什么时候加载?类何时实例化? 很多网站(包括上面提到的官方教程)都说
我读到了有关 Java 类型删除的内容 on Oracle's website . 什么时候发生类型删除?在编译时还是运行时?类什么时候加载?类何时实例化? 很多网站(包括上面提到的官方教程)都说
我试图对 Haskell 中类型族“发生”的类型级计算何时(以及多少次)形成一种直觉。对于一个具体的例子,考虑这个类型类来索引到 n-ary product使用类型级自然: {-# LANGUAGE
我正在阅读 Java Concurrency in Practice书。 在阅读关于 JMM 的章节时,它说: The JMM defines a partial ordering called ha
我读到了 Java 的类型删除 on Oracle's website . 类型删除何时发生?在编译时还是运行时?什么时候加载类?什么时候实例化类? 很多网站(包括上面提到的官方教程)都说类型删除发生
我一周前通过互联网向 Apple 申请加入 Iphone 开发计划,并向他们发送了我的 99.00 美元。 我的印象是,总的来说,响应速度很快。然而,除了一封确认我购买的电子邮件之外,我什么也没看到。
我读到了 Java 的类型删除 on Oracle's website . 什么时候发生类型删除? 在编译时还是运行时?什么时候加载类?什么时候实例化类? 很多网站(包括上面提到的官方教程)都说类型删
我读到了 Java 的类型删除 on Oracle's website . 类型删除何时发生?在编译时还是运行时?什么时候加载类?什么时候实例化类? 很多网站(包括上面提到的官方教程)都说类型删除发生
有一个快速同步问题,这是我的: a) Class1 的并发 HashMap 定义如下: ConcurrentMap map = new ConcurrentHashMap(); b) Class2
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在研究 Java 并发性并找到了以下资源以供引用, http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-su
我根据Douglas Crockford在他的书“Javascript: the good parts”中提出的布局创建了一个对象构造函数。 此构造函数在添加各种成员和方法后返回一个 that 对象。
我正在编写一个单元测试(在 Mocha 中使用 Chai)来查看某个对象 o 是否是 instanceof ClassY。单元测试成功,但我可以让它失败,具体取决于我如何创建对象文字,尽管生成的对象文
假设我有一个包装 HashMap 的类,如下所示: public final class MyClass{ private final Map map; //Called by T
我想弄清楚 happens-before 属性的确切含义。 我看到 happens-before 属性的解释说,如果全局变量(不是易变的或包含在同步块(synchronized block)中)的更新
虽然在 SO 和其他地方有很多关于 happens-before 关系的帖子,但我很难找到我的问题的明确答案。 考虑两个 Java 线程: 最初,flag == false 和 data == 0 T
http://coliru.stacked-crooked.com/a/c795a5d2bb91ae32 #include struct X { X(const char *) { std:
我读到了 Java 的类型删除 on Oracle's website . 类型删除何时发生?在编译时还是运行时?什么时候加载类?什么时候实例化类? 很多网站(包括上面提到的官方教程)都说类型删除发生
我是一名优秀的程序员,十分优秀!