如何在 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
    }
  ))
}