我将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,我不知道如何写它。有任何想法吗 ?感谢。
答案 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
}