我是Scala的新手,所以我认为这可能是一个非常小的问题。
我目前正在尝试将方法chat
从使用已弃用的WebSocket.async
更改为WebSocket.tryAccept
。该应用程序使用PlayFramework websocket-chat
我无法创建该方法所需的复杂Future
类型。
这是旧方法:
def chat() = WebSocket.async[JsValue] {
request =>
ChatRoom.join("User: 1")
}
新方法:
def chat2() = WebSocket.tryAccept[JsValue] {
request =>
try {
// ChatRoom.join returns (iteratee,enumerator)
ChatRoom.join("User: 1").map(e => Right(e))
} catch {
case e: Exception =>
Left(Ok("Failed")) // Error here
}
}
我的错误讯息:
found : Left[Result,Nothing]
required: Future[Either[Result,(Iteratee[JsValue, _], Enumerator[JsValue])]]
我不知道如何为这样一个简单的消息创建如此复杂的结果。
虽然ChatRoom.join("User: 1").map(e => Right(e))
现在没有显示任何错误,但我不确定这是否是正确的实现。
答案 0 :(得分:2)
我现在不在IDE的前面,所以我无法完全回答,但它所要求的返回类型并不像看起来那么复杂。 “Either”是“Left”或“Right”,其方式与“Option”是“Some”或“None”的方式相同。所以它要求的是一个Future(Websocket.async也应该要求),它包含一个Left [Result] - 无法连接的情况,或一个Right [(Iteratee,Enumerator)] - 成功案件。假设Chatroom.join返回Future [(Iteratee,Enumerator)],则map操作只是将其包装在“Right”中。我要尝试的第一件事就是在未来包装左(Ok(“失败”))并看看会发生什么。