简体   繁体   中英

How to properly use future/actorSelection/resolveOne in Play app?

Below is my code:

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
}

I don't understand why this doesn't work?

My objective is to have user pass in a name, which then I try to find an actor with that name using the actorSelection and resolveOne. I assume I am using it incorrectly?!

ActorSelection.resolveOne() returns a Future[ActorRef] , and because you are inside a Future(...) you get a Future[Future[Result]] in case of a valid crewname.

You can solve this by using flatMap in which case you should also return a Future in case of an invalid crewname ( None ).

Unrelated: You can also leave out the temp value and can replace the pattern matching on Option by 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
    }
  ))
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM