将多个 Future[Seq] 连接成一个 Future[Seq]

2024-05-22

如果没有 Future,这就是我将所有较小的 Seq 组合成一个大 Seq 的方式flatmap

category.getCategoryUrlKey(id: Int):Seq[Meta] // main method
val appDomains: Seq[Int]

val categories:Seq[Meta] = appDomains.flatMap(category.getCategoryUrlKey(_))

现在的方法getCategoryUrlKey可能会失败。我在前面放置了一个断路器,以避免在经过一段时间后为下一个元素调用它最大失败次数。现在断路器不会返回Seq but a Future[Seq]

lazy val breaker = new akka.pattern.CircuitBreaker(...)

private def getMeta(appDomainId: Int): Future[Seq[Meta]] = {
  breaker.withCircuitBreaker {
    category.getCategoryUrlKey(appDomainId)
  }
}

如何迭代列表appDomains并将结果组合成一个 Future[Seq] ,可能组合成 Seq 吗?

如果函数式编程适用的话,有没有办法直接转换而不需要临时变量?


使用 Future.sequence 压缩 future 的 seq

Future.sequence皈依者Seq[Future[T]] to Future[Seq[T]]

在你的情况下T is Seq。序列运算后,您将得到 Seq[Seq[T]]。因此,只需在序列操作后使用 flatten 将其展平即可。

def squashFutures[T](list: Seq[Future[Seq[T]]]): Future[Seq[T]] =
  Future.sequence(list).map(_.flatten)

你的代码变成

Future.sequence(appDomains.map(getMeta)).map(_.flatten)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将多个 Future[Seq] 连接成一个 Future[Seq] 的相关文章

随机推荐