Akka(またはScala 2.10の標準ライブラリ)に、Future[A]
失敗する可能性のあるを変換する方法はありFuture[Either[Exception,A]]
ますか?私はあなたが書くことができることを知っています
f.map(Right(_)).recover {
case e:Exception => Left(e)
}
何か見落としているのではないかと思うほど、よくあることのようです。Scala 2.9/AkkaとScala2.10の回答に興味があります。
Akka(またはScala 2.10の標準ライブラリ)に、Future[A]
失敗する可能性のあるを変換する方法はありFuture[Either[Exception,A]]
ますか?私はあなたが書くことができることを知っています
f.map(Right(_)).recover {
case e:Exception => Left(e)
}
何か見落としているのではないかと思うほど、よくあることのようです。Scala 2.9/AkkaとScala2.10の回答に興味があります。
このメソッドが欠落している主な理由は、実際には適切なセマンティクスを持っていないことです。静的な型Future[Either[Throwable, T]]
は、future が失敗しないことを保証していないため、一般的に型の変更はあまり役に立ちません。
もちろん、それらの先物を処理するすべてのコードを制御する場合は意味があります。その場合、自分で追加するのは簡単です (名前は、最初のコーヒーの前に投稿したためです。自由に、より良いものに置き換えてください)。
implicit class FutureOps[T](val f: Future[T]) extends AnyVal {
def lift(implicit ec: ExecutionContext): Future[Either[Throwable,T]] = {
val p = promise[Either[Throwable,T]]()
f.onComplete {
case Success(s) => p success Right(s)
case Failure(ex) => p success Left(ex)
}
p.future
}
}
Akka 2.0 先物と非常によく似た動作をするので、その演習は読者に任せます。
そのような変換の別のバージョン (標準の Scala で):
f.transform(tryResult => Success(tryResult.toEither))
とにかくこれをやりたいとは思わない。Akka 2.0.5 のドキュメントでは、次のように表示されていakka.dispatch.Future
ます。
abstract def onComplete[U](func: (Either[Throwable, T]) ⇒ U): Future.this.type
したがって、Future が失敗する可能性があるという情報は、既に a の動作に埋め込まれていFuture[T]
ます。同じことが Scala 2.10 の先物にも当てはまりTry[T]
ますEither[Exception, T]
。
//in scala.concurrent.Future:
abstract def onComplete[U]
(func: (Try[T]) ⇒ U)(implicit executor: ExecutionContext): Unit