如何在未来的地图链中间返回一个左,然后失败未来?我正在发送一个例子来澄清。
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
object TestApp extends App {
final case class Message(statusCode: Int, data: String)
final case class Success(data: String)
final case class Failure()
val msg = Message(500, "My data")
val future = Future { msg }
def getMessage(future: Future[Message]): Future[Either[Failure, Success]] = {
future.map { msg =>
// Evaluate msg here - if failure, make this feature fail and then return Left(Failure), otherwise, continue in the chain
msg
}.map(_.data).map(data => Right(Success(data)))
}
}
一种选择是抛出一个异常,该异常将使Future
失败,然后recover
到这样的Left
def getMessage(future: Future[Message]): Future[Either[Failure, Success]] =
future
.map(msg => if (msg.statusCode == 500) throw new RuntimeException("boom") else msg)
.map(_.data)
.map(data => Right(Success(data)))
.recover{case ex => Left(Failure())}
另一种选择是这样transform
def getMessage(future: Future[Message]): Future[Either[Failure, Success]] = {
future
.map(msg => if (msg.statusCode == 500) throw new RuntimeException("boom") else msg)
.map(_.data)
.transform(v => scala.util.Success {
v.toEither
.map(v => Success(v))
.left.map(e => Failure())
})
}
警告,您已经定义了自己的Success/Failure
,它遮蔽了 Scala 的Success/Failure
。