2017-02-16 74 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") 
 
     
 
     } 
 
    } 
 
    }