2017-02-16 84 views
1

考慮下面的代碼:提取未來阿卡HTTP

class TestActor extends Actor { 
    def receive = { 

    case "hello" => 
     sender ! Future { 
     "Sample future result" 
     } 
    } 
} 

我已經定義了以下路線:

def r5: Route = { 
    pathPrefix("check") { 
     onSuccess(system.actorOf(Props[TestActor]).ask("hello")) { 
     successResult => 
      complete { 
      "The result is " + successResult 
      } 
     } 
    } 
    } 

當我訪問的路線,我得到的輸出The result is Success(Sample future result)而我預期爲The result is Sample future result。從文檔here約的onSuccess:

求值類型未來[T]的它的參數,並且一旦未來已 已成功完成,提取其結果作爲T類型 的值,並將其傳遞到內部路由。

和給出的例子是:

val route = 
    path("success") { 
    onSuccess(Future { "Ok" }) { extraction => 
     complete(extraction) 
    } 
    } 

所以我要去哪裏錯了?

回答

2

ask返回Future[T]receive中的模式匹配處理程序將其包含在額外的Future[T]中,因此您將獲得Future[Future[String]]

如果你想只檢索T,請從FutureTestActor

case class TestResult(s: String) 
case "hello" => 
    sender ! TestResult("Sample future result") 
+0

我完全忘了問回報的未來!我的錯! – codingsplash

0

如果使用要求是不可避免的,然後在的onComplete在R5路線,你需要打開以後,你的兩倍接收未來[未來[字符串]]。

的完備將解開一個,你可以有

def r5: Route = { 
 
    pathPrefix("check") { 
 
     onSuccess(system.actorOf(Props[TestActor]).ask("hello")) { 
 
     successResult => { 
 
       successResult.Oncomplete { 
 
         case Success(res) => { 
 
           complete { 
 
             "The result is " + res //res will have Sample Future Result } 
 
         case Failure(ex) => complete("Some Error Occured") 
 
     
 
     } 
 
    } 
 
    }