如何在不显式处理非异常 Throwables 的情况下处理未来的完成

How to handle future completion without explicit handling of non-Exception Throwables

我一直用来处理 Akka 内部的 Future 完成的模式看起来像这样:

val caller = sender()
doSomethingAsync().onComplete {
  case Success(arg) => caller ! SuccessMsg(arg)
  case Failure(e:Exception) => caller ! FailureMsg()
  case Failure(e) => throw e // so as to not catch a non-exception Throwable
}

我知道我更愿意 map 未来而不是使用 onComplete,而是混合使用 Future 消息传递 语义类型的将您带到一个地方,您最终会进行副作用操作。

如果我离开 Failure(e) 案例,我会收到一条警告,提示我的模式匹配将失败,但必须匹配我知道我不应该捕捉的东西是很乏味的。有没有更好的方法来处理成功和适当的失败?

您可以使用 pipeToFuture 向 Actor 发送消息。您可以将它与 Future.recover 结合使用来处理 Failure 的情况。

import akka.pattern.pipe

doSomethingAsync()
  .map(SuccessMsg)
  .recover{ case e: Exception => FailureMsg() }
  .pipeTo(caller)