2017-01-12 3 views
0

Ich habe ein Problem mit Chaining 2-Futures zusammen, was ich möchte Folgendes zu tun ist:Chaining-Futures mit for-Schleife, die nicht nur Futures

import scala.concurrent.{ ExecutionContext, Future } 

def lastFiveFullNews: Future[Seq[FullNews]] = { 
    for (
    seq <- getLastFiveNews; 
    news <- seq; 
    fullNews <- getFullNewsById(news.id) //error at this line 

) yield fullNews 
} 

mit folgendem Verfahren Unterschriften:

def getLastFiveNews: Future[Seq[News]] 
def getFullNewsById(id: Long): Future[FullNews] 
def lastFiveFullNews: Future[Seq[FullNews]] 

Im Grunde wird ein FullNews mit einer News ID generiert. Im Idea Editor kein Fehler gemeldet wird, aber das Spiel Compiler sagt:

Typenkonflikt; gefunden: scala.concurrent.Future [FullNews] erforderlich: [?] scala.collection.GenTraversableOnce

Ich glaube das nicht, weil für Schleife in der funktioniert es nicht nur Scalas Futures, sondern auch eine Seq ist. Aber ohne Seq weiß ich nicht, wie ich es schreiben soll. Irgendwelche Ideen ? Vielen Dank.

Antwort

4

Wie Sie vermuten, können Sie nicht verschiedene Monaden in einem Verständnis zu mischen. Da Sie mit Future s arbeiten, müssen alle Zeilen im For-Comprehension Future s produzieren. Sie können Future.sequence verwenden, die eine Seq[Future[...]] zu einem Future[Seq[...]] konvertieren:

def lastFiveFullNews: Future[Seq[FullNews]] = { 
    for (
    seq <- getLastFiveNews 
    fullNews <- Future.sequence(
     seq.map(news => getFullNewsById(news.id)) 
    ) 
) yield fullNews 
} 
+0

Vielen Dank! – f7h

+0

Sie könnten auch 'Future.traverse' verwenden, die' Future.sequence' und 'Seq # map' kombiniert:' Future.traverse (seq) (news => getFullNewsById (news.id)) '. –