2017-02-07 3 views
3

Im folgenden Code muss ich das Ergebnis einer Zukunft, die nach einer anderen Zukunft aufgerufen wird, zurückgeben. Ich erhalte den folgenden Fehler in der future2.map Zeile:Rückkehr der Zukunft der Zukunft im Spiel für Scala

Typ Mismatch; gefunden: scala.concurrent.Future [play.api.mvc.Result] erforderlich: play.api.mvc.Result

Wie diese Arbeit machen?

def method1 = Action.async { request => 
    val future1 = f1 
    future1.map { result1 => 
      val future2 = f2 
      future2.map { result2 => 
       Ok(result1+result2+"") 
      } 
    } 
} 

def f1 = Future { 1 } 
def f2 = Future { 2 } 

Antwort

4

Sie könnten dies auf viele Arten tun. Aber zuerst müssen Sie verstehen, wie map und flatMap Arbeit mit Future:

def map[S](f: (T) ⇒ S): Future[S] 
def map[S](f: (T) ⇒ Future[S]): Future[Future[S]] 
def flatMap[S](f: (T) ⇒ Future[S]): Future[S] 

Beachten Sie, dass in dem oben Signaturen, Sie map und flatMap mit einem Wert fordern, dass already is a future d.h Future[<some-value>].map(...) oder Future[<some-value>].flatMap(...).

Ansatz 1:

def method1 = Action.async { request => 
    val future1 = f1 
    future1.flatMap { result1 => //replaced map with flatMap 
     val future2 = f2 
     future2.map { result2 => 
     Ok(result1+result2+"") 
     } 
    } 
    } 

    def f1 = Future { 1 } 
    def f2 = Future { 2 } 

Ansatz 2:

def method1 = Action.async { request => 
    val future1 = f1 
    future1.flatMap { result1 => //replaced map with flatMap 
     val future2 = f2 
     future2.flatMap { result2 => //replaced map with flatMap 
     Future.successful{Ok(result1+result2+"")} // used Future.successful{} to generate a Future of Result 
     } 
    } 
    } 

    def f1 = Future { 1 } 
    def f2 = Future { 2 } 
+1

Ansatz 2 fügt eine unnötige Schicht von Komplexität durch das Ergebnis in einem erfolgreichen 'Future' umgibt. Obwohl Sie es tun können, gibt es absolut keinen Grund, diesen über den ersten zu bevorzugen. – Eric

+0

Ja, ich stimme zu. Ich habe versucht, verschiedene Wege aufzuzeigen, wie 'map' und' flatMap' mit Zukunft funktionieren. Und 'Future.successful()' ist unvermeidlich, wenn wir mehrere Fälle innerhalb zukünftiger Berechnungen behandeln müssen, wobei ein Fall einen 'Zukunft (Wert)' zurückgibt und der andere Fall gibt nur "Wert" zurück. – oblivion

3

Ändern future1.map-future1.flatMap sollte es tun. Mapping über eine Future gibt eine andere Future zurück und ändert den Wert im Inneren. In diesem Fall geben Sie eine Future zurück, die eine weitereFuture enthält, die eine Result enthält. Unter Verwendung von flatMap flacht es im Wesentlichen die verschachtelten Future[Future[Result]] in eine Future[Result].