7

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の回答に興味があります。

4

3 に答える 3

13

このメソッドが欠落している主な理由は、実際には適切なセマンティクスを持っていないことです。静的な型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 先物と非常によく似た動作をするので、その演習は読者に任せます。

于 2013-01-05T09:20:08.967 に答える
4

そのような変換の別のバージョン (標準の Scala で):

f.transform(tryResult => Success(tryResult.toEither))
于 2018-09-27T11:59:32.273 に答える
0

とにかくこれをやりたいとは思わない。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
于 2013-01-05T05:48:59.493 に答える