Scala未来链接和左/右

Scala未来链接和左/右,scala,playframework,silhouette,Scala,Playframework,Silhouette,我在PLAY框架中有这段代码 def ws: WebSocket = WebSocket.acceptOrResult[JsValue, JsValue] { rh => implicit val req = Request(rh, AnyContentAsEmpty) silhouette.SecuredRequestHandler { securedRequest => Future.successful(HandlerResult(Ok, So

我在PLAY框架中有这段代码

  def ws: WebSocket = WebSocket.acceptOrResult[JsValue, JsValue] { rh =>
    implicit val req = Request(rh, AnyContentAsEmpty)

    silhouette.SecuredRequestHandler { securedRequest =>
      Future.successful(HandlerResult(Ok, Some(securedRequest.identity)))
    }.map {
      case HandlerResult(_, Some(_)) => wsFutureFlow(rh).map { flow => Right(flow) }
      case HandlerResult(r, None) => Left(r)
    }

    //    wsFutureFlow(rh).map { flow =>
    //      Right(flow)
    //    }.recover {
    //      case e: Exception =>
    //        logger.error("Cannot create websocket", e)
    //        val jsError = Json.obj("error" -> "Cannot create websocket")
    //        val result = InternalServerError(jsError)
    //        Left(result)
    //    }
  }



private def wsFutureFlow(request: RequestHeader): Future[Flow[JsValue, JsValue, NotUsed]] = {
    // Use guice assisted injection to instantiate and configure the child actor.
    implicit val timeout = Timeout(1.second) // the first run in dev can take a while :-(
    val future: Future[Any] = userParentActor ? UserParentActor.Create(request.id.toString)
    val futureFlow: Future[Flow[JsValue, JsValue, NotUsed]] = future.mapTo[Flow[JsValue, JsValue, NotUsed]]
    futureFlow
  }
我是scala的初学者,基本上我要做的是对
ws
端点的请求进行身份验证。如果它经过身份验证,那么我给它一个
流[JsValue,JsValue,None]
来充当WebSocket连接,否则我需要返回
结果
。我面临的问题是,我不太明白如何正确设计未来。对于上下文,这里是文档中经过身份验证的端点示例

未编译的行如下所示:

  case HandlerResult(_, Some(_)) => wsFutureFlow(rh).map { flow => Right(flow) }
我要传递给
WebSocket.acceptOrResult[JsValue,JsValue]
的函数需要返回
Future[Result,Flow[In,Out,.]]]
。正如您在未编译的行中所看到的,我正在尝试
Right()
Flow,但它并不完全正确。不过,注释的部分确实可以编译。下面是编译错误

[error] /home/julian/IdeaProjects/crypto-bloomberg-app/app-admin/src/main/scala/admin/controllers/HomeController.scala:32:62: type mismatch;
[error]  found   : scala.concurrent.Future[scala.util.Right[Nothing,akka.stream.scaladsl.Flow[play.api.libs.json.JsValue,play.api.libs.json.JsValue,akka.NotUsed]]]
[error]  required: Either[play.api.mvc.Result,akka.stream.scaladsl.Flow[play.api.libs.json.JsValue, play.api.libs.json.JsValue, _]]
[error]       case HandlerResult(_, Some(_)) => wsFutureFlow(rh).map { flow => Right(flow) }
[error]                                                              ^
[error] one error found
[error] (app-admin/compile:compileIncremental) Compilation failed
[error] Total time: 4 s, completed 21-Mar-2018 4:29:04 PM

谢谢

使用
flatMap
而不是
map

def ws: WebSocket = WebSocket.acceptOrResult[JsValue, JsValue] { rh =>
  implicit val req = Request(rh, AnyContentAsEmpty)

  silhouette.SecuredRequestHandler { securedRequest =>
    Future.successful(HandlerResult(Ok, Some(securedRequest.identity)))
  } flatMap {
    case HandlerResult(_, Some(_)) => wsFutureFlow(rh).map(Right(_))
    case HandlerResult(r, None) => Future.successful(Left(r))
  }
}