计算期货清单并返回结果未来

 乐橙味_367 发布于 2023-02-13 20:37

我有一个功能,需要期货Future[A]*,我希望它返回一个Future[List[A]].

def singleFuture[T](futures: List[Future[A]]): Future[List[A]] = {
  val p = Promise[T]
  futures filter { _ onComplete { case x => p complete x /*????*/ } }
  p.future
} 

而且我还希望类型的未来类型Future[List[A]]在列表期货完成后立即List[Future[A]]完成.

该代码不起作用.我想我应该flatMap在这里使用,因为应该有2个内部循环:一个用于未来,一个用于promise.但是怎么样?

我想不能用理解,因为我想了解的过程中,在更深一层意义上这里.

1 个回答
  • 这已经为您实现:

    def singleFuture[T](futures: List[Future[A]]): Future[List[A]] = Future.sequence(futures)
    

    当然,您可以查看序列的实现:

    def sequence[A, M[_] <: TraversableOnce[_]](in: M[Future[A]])(implicit cbf: CanBuildFrom[M[Future[A]], A, M[A]], executor: ExecutionContext): Future[M[A]] = {
      in.foldLeft(Promise.successful(cbf(in)).future) {
        (fr, fa) => for (r <- fr; a <- fa.asInstanceOf[Future[A]]) yield (r += a)
      } map (_.result())
    }
    

    如果你只想处理列表,而不是任何有foldLeft的东西,这可以简化:

    def sequence[A](in: List[Future[A]]): Future[List[A]] = {
      in.foldRight[Future[List[A]](Promise.successful(Nil) {
        (fa, fr) => for { r <- fr; a <- fa } yield (a :: r)
      }
    }
    

    2023-02-13 20:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有