以下是我的代码:
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。我假设我使用不正确?!
答案 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();