为什么我的"尝试"总是陷入成功"在尝试匹配时?

时间:2015-10-05 16:36:53

标签: scala playframework pattern-matching

我的目标是找到一个有效的"船员"用户传递路线中的密钥的位置。如果找到了工作人员,我们将尝试找到演员/主管并告诉它开始。在代码中,我故意给出错误的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")
      }
    )))
  }

1 个答案:

答案 0 :(得分:3)

resolveOne()会返回一个Future,这是Try的异步版本,你不应该把它包装在Try中,因为你在里面做的是创建一个新的{{1}总是有效的。这个未来只会在例外情况下完成。

同时避免为可立即返回的内容创建异步Future,例如使用Future

Future.successful

这将返回已完成的Future.successful(BadRequest(s"Invalid crew name provided: $crewType; will not run.")) ,无需在任何地方安排。

这是应该做你想做的代码

Future