是否有一个阿卡法(或在斯卡拉2.10的标准库)转换成一个Future[A]
这可能会失败成Future[Either[Exception,A]]
我知道,你可以写
f.map(Right(_)).recover {
case e:Exception => Left(e)
}
它只是似乎是我不知道我是否忽略了一些常见的任务。 我感兴趣的斯卡拉2.9 /阿卡和Scala 2.10答案。
是否有一个阿卡法(或在斯卡拉2.10的标准库)转换成一个Future[A]
这可能会失败成Future[Either[Exception,A]]
我知道,你可以写
f.map(Right(_)).recover {
case e:Exception => Left(e)
}
它只是似乎是我不知道我是否忽略了一些常见的任务。 我感兴趣的斯卡拉2.9 /阿卡和Scala 2.10答案。
为什么这种方法缺失的首要原因是,它并没有真正有良好的语义:静态类型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期货,所以我离开这个运动给读者。
这样的转换的另一种形式(在标准的Scala):
f.transform(tryResult => Success(tryResult.toEither))
我不认为你会想反正这样做。 阿卡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