我有一个函数在Promise中包装另一个函数的结果。我想把它推广到一个电梯功能,以便我可以在其他地方重新使用它。以下是原始定义:
val abc = Promise[MyType]()
try {
val suck = abc.success(someOtherFunction(intParam1, intParam2))
} catch {
case ex: Exception => p.failure(ex)
}
所以我最终做的是以下内容:
def myLiftFunc[X](x: X) (op: => X): Promise[X] = {
val p = Promise[X]()
try {
p.success(op)
} catch {
case NonFatal(ex) =>
p.failure(ex)
}
p
}
我该如何重复使用?我的意思是,我传入的第二个参数应该是一个thunk,这样我就可以传入任何函数体,而不管函数体所需的参数如何!
当我将提升的功能称为:
myLiftFunc(someOtherFunction(intParam1, intParam2))
此类型为Int => Promise[Int]
,其中someOtherFunction
返回Int
。当我致电Promise[Int]
时,我只想myLiftFunc
!
答案 0 :(得分:1)
您可能对Promise.fromTry
方法感兴趣。该方法使用Try
中的scala.util
惯用法,这是一个有用的结构,允许您将try...catch
语句更像传统结构:
Promise.fromTry { Try { someOtherFunction(intParam1, intParam2) } }
如果你想改正自己的助手(这样就不需要Try
部分,你可以试试:
def myLiftFunc[X](op: => X): Promise[X] = Promise.fromTry(Try(op))
这将允许你这样做:
myLiftFunc { /*arbitrary logic*/ }
myLiftFunc(1 + 4).future.value.get //Success(5)
myLiftFunc(1/0).future.value.get //Failure(java.lang.ArithmeticException: / by zero)