javascript - EventSource 在 addEventListener 之前错过了第一条消息
问题描述
如何防止新的 EventSource 在调用 addEventListener 之前丢失第一条消息(在纯香草 JS 中)?
问题是由于非原子操作 create-subscribe 导致的开始数据接收和处理程序订阅之间的竞争条件。如果有一种方法可以在关闭状态下创建 EventSource 或将订阅者直接传递给构造函数,那就太好了。
我可以看到两种解决方法:
- 有额外的 API 来通知服务器侦听器已准备好或在订阅者设置后请求第一个数据
- 在初始数据传输之前在服务器中添加一些睡眠超时。
它们都丑到甚至不尝试使用 SSE 并转到 WebSocket。但这是另一个问题。
解决方案
我在尝试创建 EventSource 并在 Chrome 控制台中订阅时遇到了这种情况。因此,在创建和添加侦听器之间存在几秒钟的延迟。是的,在脚本的现实生活中,延迟将接近毫秒,但它仍然存在。
这就是你的问题的原因;您经历它的全部原因是因为您通过控制台手动输入了每一行。您不能期望以这种方式输入的代码与直接在浏览器中按顺序运行的代码具有相同的行为。在“现实生活”中,这个问题并不存在,因为语句之间的时间小于毫秒,但更重要的是,代码是同步的并且阻塞了事件循环,因此在这种情况下不会错过传入的事件。要从控制台获得更接近真实的行为,您需要同时将创建和侦听器分配语句粘贴为单个块。如果您这样做,您将看到不会错过任何事件。
推荐阅读
- visual-studio-code - 在 VSCode 中将印地语设置为语言环境
- amazon-web-services - AWS ECR 映像运行时间过长
- shell - wget 从 https url 下载多个文件夹
- c# - 在按下 c# 计算器运算符时面临问题,它在按下另一个运算符时显示计算结果
- hive - 如何截断配置单元中的分区外部表?
- python - Django Rest 框架异常处理程序的位置
- codenameone - 改变textarea某段文字的样式
- javascript - 如何用组件替换字符串(vue)
- android-studio - 如何更改 android studio 3.2.1 主题
- android - 在 Pubnub 的 2 个频道上发布相同的消息