2015-10-05 82 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

相關問題