Play 2.3 - 从异步更改为 WebSocket.tryAccept

Play 2.3 - Changing to WebSocket.tryAccept from async

我是 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)) 现在没有显示任何错误,但我不确定这是否是正确的实现。

我现在不在 IDE 前面,所以我不能完全回答,但是它要求的 return 类型并不像看起来那么复杂。 "Either" 是 "Left" 或 "Right",就像 "Option" 是 "Some" 或 "None" 一样。所以它要求的是一个 Future(Websocket.async 也应该需要),它包含一个 Left[Result] —— 连接失败的情况,或者一个 Right[(Iteratee, Enumerator)] ——成功案例。假设 Chatroom.join return 是一个 Future[(Iteratee, Enumerator)],映射操作只是将其包装在 "Right" 中。我要尝试的第一件事是将 Left(Ok("Failed")) 包装在 Future 中,看看会发生什么。