如何在Play应用中正确使用future / actorSelection / resolveOne?

时间:2015-10-01 19:39:55

标签: scala playframework future

以下是我的代码:

def runAsync(crewType: String) = Action.async {
    val temp: Future[Result] = Future(Crew.findCaptainByCrewType(crewType) match {
      case None =>
        BadRequest(s"Invalid crew name provided: $crewType")
      case Some(crew) =>
        system.actorSelection(s"/user/${crew.cptName}").resolveOne().map { actorRef =>
          Ok(println("hi hi"))
        }
    })

    temp
}

我不明白为什么这不起作用?

我的目标是让用户传入一个名称,然后我尝试使用actorSelection和resolveOne找到具有该名称的actor。我假设我使用不正确?!

1 个答案:

答案 0 :(得分:1)

ActorSelection.resolveOne()会返回Future[ActorRef],因为您在Future(...)内,如果有效的人员名称,您会获得Future[Future[Result]]

您可以使用flatMap解决此问题,在这种情况下,如果人员名称无效(Future),您还应该返回None

无关:您也可以省略temp值,并可以Option替换def runAsync(crewType: String) = Action.async { Future(Crew.findCaptainByCrewType(crewType)).flatMap( _.fold( Future.successful(BadRequest(s"Invalid crew name provided: $crewType")) )( crew => system.actorSelection(s"/user/${crew.cptName}").resolveOne().map { actorRef => Ok(println("hi hi")) // not sure you want println here } )) } 上的模式匹配。

procStdIn.flush();