[英]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.