我正在尝试在下面的函数中实现错误处理。我的问题是,每当我使用MyValue作为参数时,我需要打开Future [Either [Exception,MyValue]]并测试“Right”。
如果f1到f4中的任何一个失败,策略是让Future.flow失败。
一种解决方案是将Either [Exception,MyValue]作为参数传递给funcReturnFutureEitherX(),如funcReturnFutureEither3(f2()),但这只是向下传播错误处理而不是在主程序MyFlowFunc()中处理它。
如何在下面的函数中实现错误处理并使其无阻塞运行?
def MyFlowFunc():Future[(MyValue,MyValue,MyValue,MyValue)] =
val v = Future.flow {
// fail flow if below functions fails with a Either.Left()
val f1 = funcReturnFutureEither1()
val f2 = funcReturnFutureEither2(f1())
val f3 = funcReturnFutureEither3(f2())
val f4 = funcReturnFutureEither4(f1())
val res = (f1(),f2(),f3(),f4())
}
}
def funcReturnEitherX(val:MyValue):Future[Either[Exception,MyValue]]
答案 0 :(得分:1)
如果您使用scalaz
,以下内容可能会有意义。如果没有,阅读它可能会很有趣:
Either[L,R]
与Validation[E,A]
同构,但后者通常用作Applicative Functor
。由于Future
也是一个应用函子,因此它们的组合类型Future[Validation[E, A]]
也是一个应用函数。
然后你可以使用|@|
运算符来组合参数并将它们传递给无上下文的函数。实际上,您可能需要为Applicative
编写Future
类型类。
更新:有关示例代码,请参阅this gist。