使用Future.flow时如何进行错误处理 - CPS Continuation Passing Style

时间:2012-06-27 12:30:10

标签: scala akka

我正在尝试在下面的函数中实现错误处理。我的问题是,每当我使用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]]

1 个答案:

答案 0 :(得分:1)

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

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

然后你可以使用|@|运算符来组合参数并将它们传递给无上下文的函数。实际上,您可能需要为Applicative编写Future类型类。

更新:有关示例代码,请参阅this gist