0

我有一个函数将另一个函数的结果包装在 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

4

1 回答 1

1

您可能对该Promise.fromTry方法感兴趣。该方法使用Tryfrom 的成语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)
于 2015-06-29T15:12:35.143 回答