将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是使用新闻ID生成的.在Idea编辑器中没有报告错误,但播放编译器说:
类型不匹配; 发现:scala.concurrent.Future [FullNews]必需:scala.collection.GenTraversableOnce [?]
我认为这不起作用,因为在for循环中不仅有scala的Futures而且还有seq.但没有Seq,我不知道如何写它.有任何想法吗 ?谢谢.
正如你所怀疑的那样,你不能在for-comprehension中混合使用不同的monad.因为你正在使用Future
s,所以for-comprehension中的所有行都必须产生Future
s.您可以使用Future.sequence
,将a转换Seq[Future[...]]
为Future[Seq[...]]
:
def lastFiveFullNews: Future[Seq[FullNews]] = { for ( seq <- getLastFiveNews fullNews <- Future.sequence( seq.map(news => getFullNewsById(news.id)) ) ) yield fullNews }