繁体   English   中英

使用不仅仅包含期货的for循环链接期货

[英]chaining futures with for loop containing not only futures

将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]]

基本上,会生成具有新闻ID的FullNews。 在Idea编辑器中,未报告任何错误,但播放编译器显示:

类型不匹配; 找到:scala.concurrent.Future [FullNews]必需:scala.collection.GenTraversableOnce [?]

我认为这是行不通的,因为在for循环中不仅有scala的Futures,而且还有Seq。 但是没有Seq,我不知道如何编写。 有任何想法吗 ? 谢谢。

如您所怀疑,您不能在理解中混用不同的单子。 由于您正在使用Future ,因此具有理解力的所有行都必须产生Future 您可以使用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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM