EventSource在addEventListener之前错过了第一条消息

时间:2019-05-14 00:54:22

标签: javascript addeventlistener race-condition server-sent-events

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

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

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

  • 具有其他API来通知服务器侦听器已准备就绪或在订户设置后请求第一数据
  • 在初始数据传输之前在服务器中添加一些睡眠超时。

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

1 个答案:

答案 0 :(得分:1)

  

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

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