当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《用for循环链接期货不仅包​​含期货》经验,为你挑选了1个好方法。

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



1> Alvaro Carra..:

正如你所怀疑的那样,你不能在for-comprehension中混合使用不同的monad.因为你正在使用Futures,所以for-comprehension中的所有行都必须产生Futures.您可以使用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
}

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有