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
处理程序永远不会被调用。 onopen
和 onerror
处理程序确实被调用,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 永远不会被调用