在 Scala 期货中,我应该让我的函数返回 Future 还是返回 Try?

Posted

技术标签:

【中文标题】在 Scala 期货中,我应该让我的函数返回 Future 还是返回 Try?【英文标题】:In Scala futures, should I make my functions return a Future or return a Try? 【发布时间】:2014-07-03 10:20:43 【问题描述】:

当我使用 Scala 期货时,我对应该返回未来还是返回 Try 感到困惑。由于我的代码可能会失败,所以我希望返回一个可能成功或失败的 Try,并且该函数的用户可以使用该函数来创建未来。

【问题讨论】:

【参考方案1】:

Futures 可能会失败,是的,但是这种失败是自包含的——它不会传播到您的代码的其余部分。 Future 在这个意义上与Try 非常相似,实际上它所持有的值是Option[Try[T]]

所以当你 mapFuture 时,你只会处理 Success 的情况,它是 value,如果你想处理失败,你可以使用 recoverrecoverTo .

Future回调函数也直接处理Try

 Future(...).onComplete 
     case Success(value) => ...
     case Failure(throwable) =>
 

当您需要异步结果时,请坚持使用Future,因为无论如何它在内部使用Try

【讨论】:

所以总是返回 def something() = future ,因为它里面有 Try。【参考方案2】:

如果您想异步获取结果,您应该使用FutureFuture 有 2 种类型的结果:SuccessFailure,正如您所知,它们是 Try 的后代,所以无论如何,如果发生故障,您会发现它。

【讨论】:

“你知道是 Try 的后代”:错误,什么? 查看 LimbSoup 的答案 算了,我不知何故以为你在说FutureTry 的“后代”。我可能需要再睡一会儿。【参考方案3】:

假设我正在设计另一个演员 API。我应该使用什么发送结果类型?如果我希望我的代码的客户尽可能地返回它的业务(换句话说,即发即弃类型的发送)并在将来的某个地方处理响应,我会选择Future。如果我想阻止直到回复回复,我会选择Try

希望,这会让你明白一点。

【讨论】:

以上是关于在 Scala 期货中,我应该让我的函数返回 Future 还是返回 Try?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Scala 期货与超时联系起来?

Scala 期货 - 如何在完成时结束?

为啥我的 scala 期货效率不高?

在 Scala Akka 期货中,map 和 flatMap 有啥区别?

Scala:带有地图的期货,用于 IO/CPU 绑定任务的 flatMap

在scala中过滤字符串列表的函数