首页 > 解决方案 > EventSource 在 addEventListener 之前错过了第一条消息

问题描述

如何防止新的 EventSource 在调用 addEventListener 之前丢失第一条消息(在纯香草 JS 中)?

问题是由于非原子操作 create-subscribe 导致的开始数据接收和处理程序订阅之间的竞争条件。如果有一种方法可以在关闭状态下创建 EventSource 或将订阅者直接传递给构造函数,那就太好了。

我可以看到两种解决方法:

它们都丑到甚至不尝试使用 SSE 并转到 WebSocket。但这是另一个问题。

标签: javascriptaddeventlistenerrace-conditionserver-sent-events

解决方案


我在尝试创建 EventSource 并在 Chrome 控制台中订阅时遇到了这种情况。因此,在创建和添加侦听器之间存在几秒钟的延迟。是的,在脚本的现实生活中,延迟将接近毫秒,但它仍然存在。

这就是你的问题的原因;您经历它的全部原因是因为您通过控制台手动输入了每一行。您不能期望以这种方式输入的代码与直接在浏览器中按顺序运行的代码具有相同的行为。在“现实生活”中,这个问题并不存在,因为语句之间的时间小于毫秒,但更重要的是,代码是同步的并且阻塞了事件循环,因此在这种情况下不会错过传入的事件。要从控制台获得更接近真实的行为,您需要同时将创建和侦听器分配语句粘贴为单个块。如果您这样做,您将看到不会错过任何事件。


推荐阅读