我正在使用服务器发送事件(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=铬