如何使用 transformWith() 忽略失败的期货?
How to use transformWith() to ignore failed futures?
我需要将一系列转换处理成一个转换,以便如果我有一些失败的 Future,它应该被忽略(我试图在没有 recover 或 recoverWith 的情况下执行它,但是 smth 出错了,代码失败时遇到任何失败)
type Transformation[T] = T => Future[T]
//in - Seq(trans1, trans2, trans3)
in.reduce[Transformation[T]](
(acc, el) =>
acc.andThen[Future[T]](
ft =>
ft.flatMap(el)
.transformWith[T](
t =>
t match {
case Failure(exception) => ft //this line is the most suspicious for me
case Success(value) => Future.successful(value)
}
)
)
)
transformWith
似乎无法为您提供从上一步恢复原始输入值的可能性,因为它必须使用 Try
。如果 Try
失败了怎么办?到那时,它没有原始输入可以回退,它只有 Throwable
,而不是 T
。所以,transformWith
似乎不够。
如果管道只有几个转换长,您可以尝试 foldLeft
和 fallbackTo
:
import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
type Transformation[T] = T => Future[T]
def chainTrafos[T](
trafos: List[Transformation[T]],
value: T
): Future[T] = {
trafos.foldLeft(Future { value })(
(f, t) => f.flatMap(x => t(x).fallbackTo(Future { x }))
)
}
val ta: Transformation[Int] = x => Future { x * x }
val tb: Transformation[Int] = x => Future.failed(new Error("oops"))
val tc: Transformation[Int] = x => Future { x - 58 }
println(Await.result(chainTrafos(List(ta, tb, tc), 10), 10.seconds))
打印
42
我需要将一系列转换处理成一个转换,以便如果我有一些失败的 Future,它应该被忽略(我试图在没有 recover 或 recoverWith 的情况下执行它,但是 smth 出错了,代码失败时遇到任何失败)
type Transformation[T] = T => Future[T]
//in - Seq(trans1, trans2, trans3)
in.reduce[Transformation[T]](
(acc, el) =>
acc.andThen[Future[T]](
ft =>
ft.flatMap(el)
.transformWith[T](
t =>
t match {
case Failure(exception) => ft //this line is the most suspicious for me
case Success(value) => Future.successful(value)
}
)
)
)
transformWith
似乎无法为您提供从上一步恢复原始输入值的可能性,因为它必须使用 Try
。如果 Try
失败了怎么办?到那时,它没有原始输入可以回退,它只有 Throwable
,而不是 T
。所以,transformWith
似乎不够。
如果管道只有几个转换长,您可以尝试 foldLeft
和 fallbackTo
:
import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
type Transformation[T] = T => Future[T]
def chainTrafos[T](
trafos: List[Transformation[T]],
value: T
): Future[T] = {
trafos.foldLeft(Future { value })(
(f, t) => f.flatMap(x => t(x).fallbackTo(Future { x }))
)
}
val ta: Transformation[Int] = x => Future { x * x }
val tb: Transformation[Int] = x => Future.failed(new Error("oops"))
val tc: Transformation[Int] = x => Future { x - 58 }
println(Await.result(chainTrafos(List(ta, tb, tc), 10), 10.seconds))
打印
42