gpt4 book ai didi

playframework - 服务器发送的事件在 Play Framework 中不起作用

转载 作者:行者123 更新时间:2023-12-01 12:40:33 25 4
gpt4 key购买 nike

以下代码在 Play framework 2.3 中不起作用

controllers.NotificationHandler.sendNotification():

 def sendNotification = Action {
request =>
val currentdate = new java.util.Date()
Ok("data: " + currentdate.toString())
.as( "text/event-stream")
.withHeaders("Content-Type"->"text/event-stream")
.withHeaders("Cache-Control"->"no-cache")
.withHeaders("Connection"->"keep-alive")
}

JS代码:

var event = new EventSource("@controllers.NotificationHandler.sendNotification()");
event.addEventListener('message', function( event ) {
alert(event.data);
} );

最佳答案

您应该更改 js 部分以使用到您的 Controller 的路由,而不是它自己的 Controller :

var event = new EventSource("@routes.NotificationHandler.sendNotification()");
event.addEventListener('message', function( event ) {
alert(event.data);
}
);

您的 Controller 似乎不需要 SSE,因为它只发送一个值,一个更完整的示例是创建一个枚举器并使用它来发送 SSE,如下所示:

def sendNotification = Action{
val producer = Enumerator.generateM[String](Promise.timeout(Some(Random.nextString(5)),3 second))
Ok.chunked(producer &> EventSource()).as("text/event-stream")
}

要在消息可用时发送消息,您可以使用 Concurrent.broadcast

val (producer,channel) = Concurrent.broadcast[String]
def sendNotification = Action{
Ok.chunked(producer &> EventSource()).as("text/event-stream")
}

然后使用 channel.push(yourData) 将数据推送到浏览器。请注意,在此示例中, channel 是一个全局对象。

关于playframework - 服务器发送的事件在 Play Framework 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25220325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com