【发布时间】:2016-01-09 05:57:37
【问题描述】:
Scala Futures 是异步计算的一个很好的抽象,可能会失败。当我知道不可能失败时,我应该使用什么抽象?
这是一个具体的用例:
case class Service123Error(e: Throwable)
val f1: Future[User] =
service123.call()
val f2: Future[Either[Service123Error, User]] =
f1.map(Right.apply)
.recover { case e => Left(Service123Error(e)) }
在这段代码中,类型没有模拟f2 总是成功完成的事实。给定几个类似于f2 的值,我知道我可以Future.sequence 覆盖它们(即没有快速失败的行为),但是这些类型没有携带此信息。
【问题讨论】:
-
无关:引用
EitherScalaDoc:约定规定Left用于失败,Right用于成功。 -
我总是把它搞砸了......已修复
-
如果
service123.call()不能失败,Service123Error类型代表什么?此外,Future API 代表scala.util.{Success, Failure}类型的失败和成功……如果您将Failure映射到Either,那么它就不再是关于 Future API 了,不是吗? -
service123.call()可能会失败,但f2不能,因为它会捕获所有带有recover的错误。我对Future[Either]的看法是它有3 个选项,Future.failed(e)、Future.successful(Left(l))和Future.successful(Right(r)),有3 个不同的含义,我想搭上第一个选项。 -
由于
f2是异步计算,因此可能会出现故障。如果您只认为system123中的特定错误是可恢复的(通常全部捕获不是一个好兆头),我可能会将system123.call的签名更改为Either[..., User]。
标签: scala asynchronous future scalaz