用for循环链接期货不仅含有期货

时间:2017-01-12 22:44:08

标签: scala

我将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是通过新闻&#39;生成的。 ID。 在Idea编辑器中没有报告错误,但播放编译器说:

  

类型不匹配;发现:scala.concurrent.Future [FullNews]要求:   scala.collection.GenTraversableOnce [?]

我认为这不起作用,因为在for循环中不仅有scala的期货,还有Seq。但没有Seq,我不知道如何写它。有任何想法吗 ?感谢。

1 个答案:

答案 0 :(得分:5)

正如您所怀疑的那样,您无法在理解中混合使用不同的monad。由于您正在使用Future,因此for-comprehension中的所有行都必须生成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
}