【问题标题】:Server Sent Events: JavaScript events not working服务器发送事件:JavaScript 事件不起作用
【发布时间】:2020-04-19 01:03:02
【问题描述】:

我编写了一小段代码来生成服务器发送的事件和一个相应的 JavaScript 客户端来记录所有消息。当我发送请求时,我可以在 chrome 的网络选项卡中看到浏览器正在接收来自服务器的所有消息,但在 JavaScript 中,仅触发了打开事件侦听器,并且永远不会触发消息侦听器。我在这方面花了很多时间,但没有任何成功。

这是我生成 SSE 的 Java 代码:

@GET
@Path("/updates/sse")
@Produces(MediaType.SERVER_SENT_EVENTS)
public void publishUpdates(@Context SseEventSink sseEventSink) {        
    new Thread(() -> {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            final OutboundSseEvent event = sse.newEventBuilder()
                    .name("message-to-client")
                    .data(String.class, "Hello world " + i + "!")
                    .build();
            sseEventSink.send(event);
        }
    }).start();
}

这是我处理响应的 JavaScript 代码:

    if(typeof(EventSource) !== "undefined") {
  var source = new EventSource("/gra/services/updates/sse");
  source.addEventListener('message', function(e) {
  console.log("message");
  console.log(e.data);
}, false);

source.addEventListener('open', function(e) {
  // Connection was opened.
  console.log("open");
}, false);

source.addEventListener('error', function(e) {
console.log("error");
console.log(e);
  if (e.readyState == EventSource.CLOSED) {
    // Connection was closed.
  }
}, false);
} else {
  document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
}

这是我在 chrome 控制台中得到的内容。仅调用打开的侦听器:

这是我在 chrome 的“网络”选项卡中可以看到的内容:

我试图弄清楚浏览器是否正在接收事件数据,为什么没有调用消息侦听器。

【问题讨论】:

    标签: javascript java server-sent-events


    【解决方案1】:

    example in documentation for EventSource

      /* The event "message" is a special case, as it
       * will capture events without an event field
       * as well as events that have the specific type
       * `event: message` It will not trigger on any
       * other event type.
       */
      sse.addEventListener("message", function(e) {
        console.log(e.data)
      })
    

    您的消息类型是message-to-client,而不是“无”。

    【讨论】:

    • 感谢在侦听器中输入正确的事件名称后它起作用了。
    猜你喜欢
    • 2013-09-08
    • 2022-01-16
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    相关资源
    最近更新 更多