如何在 Play 应用中正确使用 future/actorSelection/resolveOne?
How to properly use future/actorSelection/resolveOne in Play app?
下面是我的代码:
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
}
我不明白为什么这不起作用?
我的 objective 是让用户输入一个名字,然后我尝试使用 actorSelection 和 resolveOne 找到一个具有该名字的演员。我假设我使用不正确?!
ActorSelection.resolveOne()
returns a Future[ActorRef]
,并且因为你在 Future(...)
中,所以如果 crewname 有效,你会得到 Future[Future[Result]]
。
您可以使用 flatMap
解决此问题,在这种情况下您还应该 return 一个 Future
以防船员姓名无效 (None
)。
不相关:您也可以省略 temp
值,并可以将 Option
上的模式匹配替换为 Option.fold
。
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
}
))
}
下面是我的代码:
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
}
我不明白为什么这不起作用?
我的 objective 是让用户输入一个名字,然后我尝试使用 actorSelection 和 resolveOne 找到一个具有该名字的演员。我假设我使用不正确?!
ActorSelection.resolveOne()
returns a Future[ActorRef]
,并且因为你在 Future(...)
中,所以如果 crewname 有效,你会得到 Future[Future[Result]]
。
您可以使用 flatMap
解决此问题,在这种情况下您还应该 return 一个 Future
以防船员姓名无效 (None
)。
不相关:您也可以省略 temp
值,并可以将 Option
上的模式匹配替换为 Option.fold
。
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
}
))
}