2017-02-16 2 views
1

den Code unten vor:Extrahierung der Zukunft in Akka HTTP

class TestActor extends Actor { 
    def receive = { 

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

ich die unten Route definiert haben:

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

Wenn ich die Strecke zugreifen, bekomme ich die Ausgabe als The result is Success(Sample future result), während ich es erwartet zu sein The result is Sample future result. Aus der Dokumentation here über onSuccess:

Wertet seine Parameter vom Typ Zukunft [T], und sobald die Zukunft hat erfolgreich abgeschlossen worden ist, extrahiert das Ergebnis als Wert vom Typ T und leitet sie an den inneren Weg .

und das Beispiel gegeben ist:

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

Also, wo soll ich falsch?

Antwort

2

ask gibt eine Future[T] zurück. Ihr Pattern-Match-Handler innerhalb von receive fügt ihn in eine zusätzliche Future[T] ein, so dass Sie eine Future[Future[String]] erhalten.

Wenn Sie nur wollen T abzurufen, entfernen Sie die Future von Ihrem TestActor:

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

ich völlig vergessen haben, dass die Renditen eine Zukunft fragen! Mein Fehler! – codingsplash

0

Wenn die Verwendung von fragen dann in der onComplete in r5 Route müssen Sie die Zukunft zweimal öffnen unvermeidlich ist, wie Sie sind eine Zukunft empfangen [Future [String]].

Die auf Complete ein auspacken und Sie können

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