EventSource 在 addEventListener 之前错过了第一条消息
EventSource misses first messages before addEventListener
如何防止新的 EventSource 在调用 addEventListener 之前丢失第一条消息(在纯 vanilla JS 中)?
问题是由于非原子操作创建-订阅导致开始数据接收和处理程序订阅之间的竞争条件。
如果有一种方法可以在关闭状态下创建 EventSource 或将订阅者直接传递给构造函数,那就太好了。
我可以看到两个解决方法:
- 有额外的API来通知服务器侦听器已准备就绪或在订阅者设置后请求第一个数据
- 在初始数据传输之前在服务器中添加一些睡眠超时。
他们都丑到连 SSE 都不去尝试去 WebSocket 了。但这是另一个问题。
I faced this situation trying to create EventSource and subscribe in Chrome Console. So, there was a lag in seconds between creation and adding a listener. Yes, in real life in script the lag will be near milliseconds, but it still exists.
这就是您遇到问题的原因;您遇到这种情况的全部原因是因为您通过控制台手动输入了每一行。您不能期望以这种方式输入的代码在浏览器中直接按顺序与代码 运行 表现相同。在"real life"中不存在问题因为语句之间的时间少于毫秒,但不止于此,代码是同步的并且阻塞了事件循环,所以在那种情况下传入的事件将永远不会被遗漏。要从控制台获得更接近真实的行为,您需要同时将 both 创建和侦听器分配语句粘贴为一个块。如果这样做,您会发现不会错过任何事件。
如何防止新的 EventSource 在调用 addEventListener 之前丢失第一条消息(在纯 vanilla JS 中)?
问题是由于非原子操作创建-订阅导致开始数据接收和处理程序订阅之间的竞争条件。 如果有一种方法可以在关闭状态下创建 EventSource 或将订阅者直接传递给构造函数,那就太好了。
我可以看到两个解决方法:
- 有额外的API来通知服务器侦听器已准备就绪或在订阅者设置后请求第一个数据
- 在初始数据传输之前在服务器中添加一些睡眠超时。
他们都丑到连 SSE 都不去尝试去 WebSocket 了。但这是另一个问题。
I faced this situation trying to create EventSource and subscribe in Chrome Console. So, there was a lag in seconds between creation and adding a listener. Yes, in real life in script the lag will be near milliseconds, but it still exists.
这就是您遇到问题的原因;您遇到这种情况的全部原因是因为您通过控制台手动输入了每一行。您不能期望以这种方式输入的代码在浏览器中直接按顺序与代码 运行 表现相同。在"real life"中不存在问题因为语句之间的时间少于毫秒,但不止于此,代码是同步的并且阻塞了事件循环,所以在那种情况下传入的事件将永远不会被遗漏。要从控制台获得更接近真实的行为,您需要同时将 both 创建和侦听器分配语句粘贴为一个块。如果这样做,您会发现不会错过任何事件。