このような問題に直面した場合、さまざまな型を理解のために使用したい場合は、1つの型を試して選択し、他の型をその型にマップすることができます。あなたの状況では、先物のユニークなプロパティ(非同期)を考えると、私はFuture
を最低共通の分母として選択し、Try
をFuture
にマッピングします。
今
val result = for{
a <- someFuture
b <- tryToFuture(processResult(a))
} yield b
result.map { /* Success Block */ } recover { /* Failure Block */ }
def tryToFuture[T](t:Try[T]):Future[T] = {
t match{
case Success(s) => Future.successful(s)
case Failure(ex) => Future.failed(ex)
}
}
あなたは、これは非常に一般的な状況であることが判明し、あなたは私はあなたが暗黙のようtryToFuture
方法を定義することができたとし、常に明示的な変換を追加する必要が好きではなかった場合:あなたは、単にこのようにすることを行うことができますいくつかのヘルパーオブジェクト上でこのように、必要な場所にそれをインポートします。
object FutureHelpers{
implicit def tryToFuture[T](t:Try[T]):Future[T] = {
t match{
case Success(s) => Future.successful(s)
case Failure(ex) => Future.failed(ex)
}
}
}
import FutureHelpers._
val result = for{
a <- someFuture
b <- processResult(a)
} yield b
result.map { /* Success Block */ } recover { /* Failure Block */ }
だけFuture.success
とFuture.failed
を呼び出すと、それはボンネットの下にそれに別のタスクを提出することでスコープにあるものExecutionContext
に影響を与えていることを覚えておいてください。
EDIT
ヴィクトルはコメントで指摘したように、あなただけの下からの更新例のようにFuture.fromTry
を使用している場合、Future
にTry
を変換するプロセスがさらに簡単です:
val result = for{
a <- someFuture
b <- Future.fromTry(processResult(a))
} yield b
result.map { /* Success Block */ } recover { /* Failure Block */ }
これはおそらく、暗黙のうちに自分のコンバージョンロジックを動かすことと比べて最良の賭けです。およそ
val result = for(a <- someFuture) yield for(b <- processResult(a)) yield b;
それがきちんと見えませんがどのように
は現在、[議論がありませんでしたscala-user](https://groups.google.com/d/topic/scala-user)/Mu4_lZAWxz0/discussion)に 'Try'を' Future'に変換する正確な問題について説明します。おそらく、このようなヘルパーはどこかの標準ライブラリに含まれるべきです。 – gourlaysama
Future.fromTry? –
@ViktorKlang、そうです。私はそのアプローチを含めるために私の答えを更新しました。ヘッドアップをありがとう。 – cmbaxter