2017-01-12 2 views
0

У меня есть проблема с цепочкой 2 фьючерсов вместе, что я хотел бы сделать, это следующее:цепных фьючерсы с цикл, содержащие не только фьючерсы

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 
} 

со следующими сигнатурами методов:

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

в основном FullNews генерируется с идентификатором News. В редакторе Idea не сообщается об ошибке, но компилятор игры говорит:

тип несоответствие; найдено: scala.concurrent.Future [FullNews] требуется: [?] scala.collection.GenTraversableOnce

Я думаю, что это не работает, потому что в течение цикла есть не только фьючерсов, но Scala также Seq. Но без Seq я не знаю, как его написать. Есть идеи ? Благодарю.

ответ

4

Как вы подозреваете, вы не можете смешивать разные монады в понимании. Поскольку вы работаете с Future s, все строки для понимания должны производить Future s. Вы можете использовать Future.sequence, который будет преобразовывать Seq[Future[...]] к Future[Seq[...]]:

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

Большое спасибо! – f7h

+0

Вы также можете использовать 'Future.traverse', объединяющий' Future.sequence' и 'Seq # map':' Future.traverse (seq) (news => getFullNewsById (news.id)) '. –

Смежные вопросы