如果没有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
可能会失败 . 我在前面放了一个断路器,以避免在 maxFailures 之后为下一个元件调用它 . 现在断路器没有返回 Seq
但是 Future[Seq]
lazy val breaker = new akka.pattern.CircuitBreaker(...)
private def getMeta(appDomainId: Int): Future[Seq[Meta]] = {
breaker.withCircuitBreaker {
category.getCategoryUrlKey(appDomainId)
}
}
如何遍历List appDomains
并将结果合并到一个Future [Seq]中,可能进入Seq?
如果函数式编程适用,有没有办法在没有临时变量的情况下直接转换?
3 回答
使用Future.sequence压制期货的seq
Future.sequence
将Seq[Future[T]]
转换为Future[Seq[T]]
在你的情况下
T
是Seq
. 在序列操作之后,您将得到Seq [Seq [T]] . 因此,在使用展平的顺序操作之后,将其展平 .你的代码变成了
从TraversableOnce [Future [A]]到Future [TraversableOnce [A]]
Future.successful(appDomains)
将appDomains
提升到Future
的上下文中希望这可以帮助 .
如果你想拒绝唯一失败的未来但保留成功的未来,那么我们必须有点创造力并使用承诺 Build 我们的未来 .