2

我正在尝试在下面的函数中实现错误处理。我的问题是每次我使用 MyValue 作为参数时,我都需要打开 Future[Either[Exception,MyValue]] 并测试“正确”。

如果 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]]
4

1 回答 1

1

如果您使用scalaz,以下内容可能会有意义。如果没有,阅读它可能会很有趣:

Either[L,R]与 同构Validation[E,A],但后者通常用作Applicative Functor. 由于Future也是一个应用函子,它们的组合类型Future[Validation[E, A]]也是一个应用程序。

然后,您可以使用|@|运算符组合参数并将它们传递给无上下文函数。在实践中,您可能需要ApplicativeFuture.

更新:请参阅此要点以获取示例代码。

于 2012-06-27T16:05:36.967 回答