转换阿卡的未来[A]至未来[要么[异常,A]](converting Akka's Futu

2019-07-17 20:35发布

是否有一个阿卡法(或在斯卡拉2.10的标准库)转换成一个Future[A]这可能会失败成Future[Either[Exception,A]] 我知道,你可以写

f.map(Right(_)).recover {
  case e:Exception => Left(e)
}

它只是似乎是我不知道我是否忽略了一些常见的任务。 我感兴趣的斯卡拉2.9 /阿卡和Scala 2.10答案。

Answer 1:

为什么这种方法缺失的首要原因是,它并没有真正有良好的语义:静态类型Future[Either[Throwable, T]]并不能确保未来不能失败,因此类型变化不会获得你一般多。

当然,它可以使意义,如果你控制所有这些处理这些期货的代码,在这种情况下它是微不足道的它自己添加(名字是因为我第一次咖啡之前发布,随时与更好的东西来代替):

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
  }
}

它的工作原理非常类似于与阿卡2.0期货,所以我离开这个运动给读者。



Answer 2:

这样的转换的另一种形式(在标准的Scala):

f.transform(tryResult => Success(tryResult.toEither))


Answer 3:

我不认为你会想反正这样做。 阿卡2.0.5的文档显示此为akka.dispatch.Future

abstract def onComplete[U](func: (Either[Throwable, T]) ⇒ U): Future.this.type

因此,未来可能会失败的信息已经被嵌入的行为Future[T] 这同样适用于斯卡拉2.10期货,在未来可以完成的Try[T]这是目的的类似Either[Exception, T]

//in scala.concurrent.Future:
abstract def onComplete[U]
  (func: (Try[T]) ⇒ U)(implicit executor: ExecutionContext): Unit


文章来源: converting Akka's Future[A] to Future[Either[Exception,A]]