EventSource可能存在竞争条件



我正在使用服务器发送事件(SSE(,连接到SSE后端的代码如下所示:

function sseSubscribe() {
events = new EventSource("/v1/sse/" + sseID + "/" + lastEventId);
events.addEventListener("message", sseHeartbeat);
events.addEventListener("error", sseError);
events.addEventListener("reply", sseReply);
events.addEventListener("refresh", sseRefresh);
}

调用此函数是为了设置初始SSE连接,但当需要重新连接时(因为连接因任何原因断开(,

在服务器上,如果lastEventId大于0,它将把任何丢失的消息流式传输到客户端。

因此,假设阻止执行new EventSource(),这将不起作用,因为在注册相应的事件处理程序(回复、刷新等(之前,事件将被流式传输回浏览器。

然而,据我所知,事实并非如此(我认为调用new EventSource是一种非阻塞操作?但不确定(。然而,我认为可能如果用户的计算机足够慢,并且他们的连接足够快,那么丢失的消息可能会在侦听器注册之前流式传输回来。

这是一种合理的恐惧,还是我应该对上面的代码感到相对安全?

重申一下,这段代码似乎有效,但我担心的是,在添加相应的处理程序之前,消息可能会从新的EventSource连接流式传输回来。这合理吗,还是有0%的可能性发生?

连接发生在当前Javascript执行完成之后。我相信这对所有浏览器来说都是安全的,尽管我没有一个明确的参考。

例如,Chrome从计时器启动连接,计时器可能与setTimeout绑定到同一事件循环中:https://source.chromium.org/chromium/chromium/src/+/main:第三方/blink/renderer/modules/eventsource/event_source.cc;l=99?q=事件源&ss=铬

相关内容

  • 没有找到相关文章

最新更新