2016-07-20 23 views
0

Ich möchte meinen Codevereinfachen, um es so einfach wie möglich zu machen.Wie vereinfacht man die zukünftige Ergebnisbehandlung in Akka/Futures?

Hier ist der Code

case object Message 

class SimpleActor extends Actor { 
    def receive = { 
    case Message => sender ! Future { "Hello" } 
    } 
} 

object SimpleActor extends App { 

    val test = ActorSystem("Test") 
    val sa = test.actorOf(Props[SimpleActor]) 

    implicit val timeout = Timeout(2.seconds) 

    val fRes = for { 
    f <- (sa ? Message).asInstanceOf[Future[Future[String]]] 
    r <- f 
    } yield r 

    println { 
    Await.result(fRes, 5.seconds) 
    } 

} 

Ist es möglich, diesen Teil

.asInstanceOf[Future[Future[String]]] 

loswerden?

Antwort

2

Sehen Sie sich die pipeTo Funktion an, bei der es darum geht, einen Future zwischen den Aktoren zu übergeben. Siehe here auf fragen Muster.

myFuture pipeTo sender 

Der Rückgabetyp Ihres wird Future[String] in Ihrem Fall fragen, die als Sie Ihren Kommentar unten müssen die mapTo[String] fragt tatsächlich das Ergebnis Typ erhalten eine String zu sein. So kann Ihr für-comp ditched werden konnte und direkt aufgerufen:

val fRes = (sa ? Message).mapTo[String] 
+0

Sie meinen, ich Funktion ändern müssen erhalten zu 'def erhalten = {. Fall Message => Future ("Hallo") pipeTo (Sender)}' und map Ergebnis in for-comp wie folgt 'for {f <- (sa? Nachricht) .mapTo [String]} yield f', oder? – Finkelson

+0

@Finkelson ja, im Wesentlichen. 'pipeTo' macht die Nachricht" abgeflacht ", so dass Sie nur eine' Zukunft' erhalten. – wheaties

+0

Nun, es ist interessant. Vielen Dank. – Finkelson