scala - 重试返回 Future 的函数

标签 scala exception future

假设我有一个函数 foo执行异步计算并返回 Future :

def foo(x: Int)(implicit ec: ExecutionContext): Future[Int] = ???

现在我想重试这个计算 n直到计算成功为止。

def retryFoo(x: Int, n: Int)(implicit ec: ExecutionContext): Future[Int] = ???

我还想返回重试时抛出的所有个异常。所以,我定义了新的异常类 ExceptionsList并要求 retryFoo返回 ExceptionsList当所有重试都失败时。

case class ExceptionsList(es: List[Exception]) extends Exception { ... }  

你会怎么写retryFoo重试foo并返回 Future使用 foo结果或ExceptionsList ?

最佳答案

我可能会这样做:

final case class ExceptionsList(es: List[Throwable]) extends Throwable
def retry[T](n: Int, expr: => Future[T], exs: List[Throwable] = Nil)(implicit ec: ExecutionContext): Future[T] =
  Future.unit.flatMap(_ => expr).recoverWith {
    case e if n > 0 => retry(n - 1, expr, e :: exs)
    case e => Future.failed(new ExceptionsList(e :: exs))
  }

expr 是按名称调用的,因为它本身可以抛出异常而不是返回失败的 Future。我将累积的异常记录在一个列表中,但我想这是一种品味。

关于scala - 重试返回 Future 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59032680/

相关文章:

json - Play : How to implement a conditional JSON validator

从内部使迭代器映射超时的 Scala 惯用方法?

c# - 抛出另一个异常的异常

c# - System.Net.Mail无法加载或初始化请求的服务提供者

list - flutter : How put received data on model as nested List

java - 如何使用cacheApi在play框架中设置清理缓存超时?

c++ - 为什么这个程序无法捕获异常?

java - 了解 future /线程

Scala 从 Try 到 Future 的隐式转换

scala - 为什么方法体中的顶级 val 会影响 Scala 中的方法参数?