同步2个或更多Futures的计算

 LD系瑰精棂_142 发布于 2023-02-06 18:32

我发现我无法弄清楚如何同步2和更多的计算Futures:

val fs = List(1, 2, 3) map { x => Future { /* some computation depending on x... */ } }
fs(0) onComplete {
  case Success(x) => 
    fs(1) onComplete { 
      case Success(x) => 
        fs(2) onComplete ....
}

这看起来不合理.

我想从中得到所有的价值fs.我该怎么做呢?

1 个回答
  • 使用 Future.traverse

    val inList = List(1, 2, 3)
    val fs = Future.traverse(inList) { x =>
      Future {
        /* some computation depending on x... */
      }
    }
    
    fs onSuccess { case outList => 
      ...
    }
    

    如果任何元素失败,这将失败.

    如果您想要所有结果,无论失败或成功,那么最好的方法是将recover它们包装在以下实例中Try:

    def asyncFunc(i: Int): Future[String] = ...
    
    val inList = List(1, 2, 3)
    val rawResults = inList.map(asyncFunc)
    val recoveredResults = rawResults.map(Success(_)).recover(case x => Failure(x))
    
    val completedResults = Future.sequence(recoveredResults)
    
    completedResults onSuccess { case outList =>
      outList map {
        case Success(s) => ...
        case Failure(t) => ...
      }
    }
    

    提示:如果你做了很多这样的事情,通常更容易确保你的所有异步方法成功完成Future[Try[T]],而不是嵌入任何错误Future

    像这样的东西:

    def slowFunc(i: Int): String = ...
    def asyncFunc(i: Int): Future[Try[String]] = Future { Try { slowFunc(i) } }
    
    val inList = List(1, 2, 3)
    val results = Future.traverse(inList)(asyncFunc)
    
    results onSuccess { case outList =>
      outList map {
        case Success(s) => ...
        case Failure(t) => ...
      }
    }
    

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