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
}

これを再利用するにはどうすればよいですか?つまり、渡す 2 番目の引数はサンクにする必要があるため、関数本体が必要とするパラメーターに関係なく、任意の関数本体を渡すことができます。

持ち上げられた関数を次のように呼び出すと:

myLiftFunc(someOtherFunction(intParam1, intParam2))

これは 型Int => Promise[Int]で、 はをsomeOtherFunction返しますInt。私はちょうどPromise[Int]私が電話したときに欲しいmyLiftFunc

4

1 に答える 1

1

Promise.fromTryメソッドに興味があるかもしれません。このメソッドはTry慣用句 fromを使用します。これは、ステートメントを従来の構成体のよう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 に答える