【发布时间】:2018-03-01 13:30:25
【问题描述】:
当涉及到在不同条件下从 Future 返回不同结果时,我实际上正在寻找更好的 Scala 构造。
比方说,在 Future 中,我需要在返回成功结果之前进行某些验证。有两种方法可以做到这一点。
我的方式:
Future {
if(!validation1()) return Future.failed("Validation1 failed!")
if(!validation2()) return Future.failed("Validation2 failed!")
if(!validation3()) return Future.failed("Validation3 failed!")
Future.successful()
}.flatMap(identity)
方式二:
Future {
if(!validation1())
Future.failed("Validation1 failed!")
else {
if(!validation2())
Future.failed("Validation2 failed!")
else {
if(!validation3())
Future.failed("Validation3 failed!")
else {
Future.successful("Results")
}
}
}
}.flatMap(identity)
但是Way I有问题,导致异常scala.runtime.NonLocalReturnControl。你可以在这个链接中找到解释:https://tpolecat.github.io/2014/05/09/return.html
这给我们留下了Way II。不过,这种构造的问题在于,随着验证次数的增加,它很快就会变得丑陋。
谁能提出更好的表达方式?
请让我知道这是否适合这个问题,或者这个问题需要以更好的方式表达。
TIA.
【问题讨论】:
-
这绝对是此类问题的正确位置;)但是,这两种变体(即使它们有效)似乎都会返回类似
Future[Future[String]]的内容。你真的想要那个吗?如果您不想这样,也许您可以尝试调整您的示例,直到它们忠实地代表您希望在实际代码中实现的目标。 -
我不确定我是否理解正确,但如果您验证某个表单,您通常希望返回所有失败验证的信息,而不仅仅是您找到的第一个。
-
看起来你可能想使用Validated。
-
pure(fx).flatMap(identity) = fx对于每个fx: Future[X] -
@AndreyTyukin 我已修复代码以返回 Future[String]。我在外部未来返回 Future.successful 和 Future.failed 的原因是因为失败案例通常也可以返回异常。实际上这就是我在实际代码中所做的。