如何在不显式处理非异常 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)
案例,我会收到一条警告,提示我的模式匹配将失败,但必须匹配我知道我不应该捕捉的东西是很乏味的。有没有更好的方法来处理成功和适当的失败?
您可以使用 pipeTo
从 Future
向 Actor 发送消息。您可以将它与 Future.recover
结合使用来处理 Failure
的情况。
import akka.pattern.pipe
doSomethingAsync()
.map(SuccessMsg)
.recover{ case e: Exception => FailureMsg() }
.pipeTo(caller)
我一直用来处理 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)
案例,我会收到一条警告,提示我的模式匹配将失败,但必须匹配我知道我不应该捕捉的东西是很乏味的。有没有更好的方法来处理成功和适当的失败?
您可以使用 pipeTo
从 Future
向 Actor 发送消息。您可以将它与 Future.recover
结合使用来处理 Failure
的情况。
import akka.pattern.pipe
doSomethingAsync()
.map(SuccessMsg)
.recover{ case e: Exception => FailureMsg() }
.pipeTo(caller)