【问题标题】:How to use transformWith() to ignore failed futures?如何使用 transformWith() 忽略失败的期货?
【发布时间】:2021-01-10 00:52:35
【问题描述】:

我需要将转换序列处理为一个转换,以便如果我有一些失败的 Future 它应该被忽略(我试图在没有恢复或恢复的情况下这样做,但是 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)
              }
          )
    )
)

【问题讨论】:

  • 一个变换的输出是下一个变换的输入?
  • 一次转换的输出是下一次转换的输入? - 是的,按照我的理解组合它们来制作转换链
  • 我想我猜...这是因为我没有处理 acc 初始失败的变体

标签: scala future


【解决方案1】:

transformWith 似乎无法为您提供从上一步中恢复原始输入值的可能性,因为它必须与Try 一起使用。如果Try 失败了该怎么办?到那时,它没有要回退的原始输入,它只有Throwable,而不是T。所以,transformWith 似乎不够用。

如果管道只有几个转换,您可以尝试foldLeftfallbackTo

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

【讨论】:

  • 很好!谢谢!这项工作的最初未来也失败了!
  • fallbackTo 的绝佳用例!
猜你喜欢
  • 2014-01-19
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多