SSE:“onmessage”永远不会被调用

Posted

技术标签:

【中文标题】SSE:“onmessage”永远不会被调用【英文标题】:SSE: 'onmessage' never gets called 【发布时间】:2019-12-30 05:27:21 【问题描述】:

我正在关注互联网上关于如何从 javascript 监听服务器发送事件的最简单教程:

var es = new EventSource('url')
es.onmessage = function (e)  console.log(e.data) 

但我的 message 处理程序永远不会被调用。 onopenonerror 处理程序确实被调用,Chrome 开发工具确实显示了服务器发送的事件的一个很好的“流”视图,如果我从 curl 进行相同的调用,我会得到一个格式很好的事件流以正确的方式。有什么问题?

【问题讨论】:

【参考方案1】:

刚刚从this tutorial 了解到,您可以将事件名称与每个服务器发送的事件相关联。

当您这样做时,message 侦听器将停止被调用,而您必须为您发送的每种事件设置一个新的特殊侦听器。我是在我的服务器上这样做的。

所以我不得不使用es.addEventListener("special-event-name", function () ...),而不是es.onmessage = function () ...

【讨论】:

您也可以为每个自定义事件设置message 侦听器和侦听器。 这不是它为我工作的方式。但如果您认为这是真的,请回答最初的问题。 查看我的单独答案以获取示例。【参考方案2】:

这是一个最小的示例,展示了如何在同一 SSE 流上获取默认的 message 事件类型和自定义事件类型。

<html lang="en">
  <body>
    <div id="payload"></div>
    <script>

      const stream = new EventSource('https://url-goes-here');

      stream.addEventListener('message', (event) => 
        document.getElementById('payload').innerText = `Received a regular message: $event.data`;
      , false);

      stream.addEventListener('myEvent', (event) => 
        document.getElementById('payload').innerText = `Received a myEvent message: $event.data`;
      , false);

    </script>
  </body>
</html>

【讨论】:

我在创建这个问题之前尝试了很多,它没有用。 现在我意识到您在同一个流中谈论不同的消息!然后它可以工作。但是,如果您的消息被标记为myEvent,那么onmessage 将不会处理它。 啊,现在我明白你的意思了。不,onmessage 仅处理默认消息类型message。这就是为什么您要为您关心的事件类型显式添加事件侦听器。

以上是关于SSE:“onmessage”永远不会被调用的主要内容,如果未能解决你的问题,请参考以下文章

aSmack MessageListener 的 processMessage 永远不会被调用

C# 创建 websocket - onmessage 函数不起作用

IOS:UITextInput 上的 Tokenizer 永远不会被调用

S3.putObject - 回调永远不会被调用

QAbstractItemModel data() 永远不会被调用

Hibernate @PostLoad 永远不会被调用