2017-02-16 18 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:

Оценивает свой параметр типа Future [T], и как только будущее имеет был успешно завершен, извлекает его результат в виде значения типа Т и передает его к внутреннему маршруту ,

и пример, приведенный в:

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

Итак, где я буду неправильно?

ответ

2

ask возвращает Future[T]. Обработчик соответствия шаблону внутри receive обертывает его дополнительным Future[T], поэтому вы получаете Future[Future[String]].

Если вы хотите только получить T, удалить Future из вашего TestActor:

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

Я совершенно забыл, что спросить возвращает будущее! Виноват! – codingsplash

0

Если использование спросить неизбежно, то в OnComplete в маршруте r5 вам нужно открыть будущее в два раза, как вы получение будущего [Future [String]].

на Complete будет разворачивать один, и вы можете иметь

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") 
 
     
 
     } 
 
    } 
 
    }