2015-10-05 80 views
1

我的目标是找到一个有效的“船员”,其中用户通过路线中的钥匙。如果找到工作人员,我们将尝试找到演员/主管并告诉它开始。在代码中,我故意给出了错误的actor路径,所以它会抛出“ActorNotFound”异常。我期待它匹配“失败(失败)”,所以我可以返回一个错误的请求;但它一直陷入“成功”。这是为什么?为什么我的“尝试”在尝试匹配时总是陷入“成功”?

代码:

def index = Action.async { 
    val crewType = "x" 
    Future(Crew.findCaptainByCrewType(crewType)).flatMap(_.fold(
     Future(BadRequest(s"Invalid crew name provided: $crewType; will not run.")) 
    )(crew => 
     Future(Try(system.actorSelection(s"/user/${crew.cptName}randomness").resolveOne().map {actorRef => 
     actorRef ! "hi hi" 
     }) match { 
     case Success(success) => 
      Logger.info("success") 
      Ok("success") 
     case Failure(ex) => 
      Logger.error("failure", ex) 
      BadRequest("failure") 
     } 
    ))) 
    } 

回答

3

resolveOne()返回Future这是一种的Try异步版本,你不应该在尝试,因为你里面有什么是创建一个新Future永远奏效包裹。这个未来将会例外完成。

还避免为立即返回的内容创建异步Future,请使用Future.successful来处理此问题。

Future.successful(BadRequest(s"Invalid crew name provided: $crewType; will not run.")) 

这将返回已经完成Future没有安排在任何地方。

这是应该做的,你想

+0

TIL什么如何恢复工作的代码。非常感谢! – iCodeLikeImDrunk

+0

以及Future.successful。 – iCodeLikeImDrunk

相关问题