我试图理解为什么有人会使用 Future.successful(Failure(ServiceException("error")))
而不是 Future.failed(ex)
在 Scala 中。
Future.successful(
Failure(
ServiceException(ErrorTypes.Validation, "Value should not be more than 30")
)
)
最佳答案
很难说作者为什么这样做,我可以猜测几个原因:
他们不知道您可以通过
Future.fail
返回失败的 future。发生这种情况可能是因为 future 的签名没有在类型中明确传达失败路径。当您看到Future[A]
时,您可能会认为此计算将来一定会成功他们想明确指出失败。当我声明
Future[Try[A]]
时,我迫使调用者处理无法直接访问A
的事实,但必须“跳转另一跳” "进入A
。尽管这很微妙,但人们可以轻松地写出:val f: Future[Try[String]] = ??? f.map(_.map(str => // stuff with string))
但也许签名会迫使调用者意识到失败的可能性。尽管
Try
的表达能力也受到很大限制,因为它只能在失败路径上返回一个Throwable
。我发现Future[Either[E, A]]
在这方面更具表现力,它允许您构建自己的故障层次结构并将其编码在类型中。
关于一元仿函数 IO 类型 (Future[A]
) 与双仿函数 IO 类型 (IO[E, A]
,即 ZIO )。我赞成双仿函数并且最近才使用它,我发现当我不必深入研究实现来了解计算可能出现的失败时,它真的很节省时间。
关于scala - Future.successful(Failure(Exception)) 与 Future.failed(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65801013/