Ich bin langsam um Futures in Scala, und habe ein bisschen eine Schicht Kuchen, die ich versuche zu enträtseln. Der spezifische Anwendungsfall ist ein DeferredResolver
in sangria-graphql + akka. Ich habe ihren Demo-Code gestohlen, der so aussiehtIn Scala Futures verloren
Future.fromTry(Try(
friendIds map (id => CharacterRepo.humans.find(_.id == id) orElse CharacterRepo.droids.find(_.id == id))))
und fügte meine eigene Modifikation hinzu. Ihrige tut eine Lookup im Speicher, während mein etwas von einem anderen Schauspieler fragt:
Future.fromTry(Try(
accountIds match {
case h :: _ =>
val f = sender ? TargetedMessage(h)
val resp = Await.result(f, timeout.duration).asInstanceOf[TargetedMessage]
marshallAccount(resp.body)
case _ => throw new Exception("Not found")
}
))
Die zugehörige Stück hier ist, dass ich das erste Element in der Liste auswählen, senden Sie es an einem ActorRef
, die ich an anderer Stelle bekam und warten das Ergebnis. Das funktioniert. Was ich aber tun möchten, müssen nicht hier, auf das Ergebnis warten, aber die ganze Sache als Future
Future.fromTry(Try(
accountIds match {
case h :: _ =>
sender ? TargetedMessage(h) map {
case resp:TargetedMessage => marshallAccount(resp.body)
}
case _ => throw new Exception("Not found")
}
))
Das funktioniert nicht zurück. Wenn diese verbraucht wird, statt Account
vom Typ sein (der Rückgabetyp der Funktion marshallAccount
, es vom Typ Promise. Wenn ich richtig verstehe, dann ist es, weil stattdessen einen Rückgabetyp Future[Account]
zu haben, hat dies eine Art von Future[Future[Account]]
Wie abflachen ich diese