播放2.3 - 从异步更改为WebSocket.tryAccept

时间:2015-02-25 17:54:52

标签: scala playframework

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

1 个答案:

答案 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(“失败”))并看看会发生什么。