【问题标题】:scala-cats EitherT: chaining futuresscala-cats EitherT:链接期货
【发布时间】:2022-01-22 17:47:21
【问题描述】:

我关注this。我的程序结构是:

(for {
        data <- myService.fetch(id).eitherT
        values <- anotherService.fetch(data.id).eitherT
        // todo: process values as part of forcomprehension
      } yield data.id).value

myService.fetch 返回 Future[...]。

anotherService.fetch 也返回 Future[...],values 是一个 Seq。 我想使用 foreach 处理值中的条目

values.foreach(value => service.moreAction(value))

moreAction 也返回 Future[...]

因此,我的目标是将它与以前的 Futures 链接起来以供理解。

什么是惯用的做法?

【问题讨论】:

    标签: scala scala-cats


    【解决方案1】:

    在Cats中如果你想遍历一些数据的所有值,对它们应用一些效果,然后在这个效果中得到一个数据:

    DataOf[A] => (A => Effect[B]) => Effect[DataOf[B]]
    

    您使用 Traverse 类型的类及其扩展方法。

    (把它想象成Future.sequence 的泛化,它接受Seq[Future[A]] 并返回Future[Seq[A]],但它可以一步执行seq.map(toFuture)Future.sequence)。

    import cats.syntax.traverse._
    
    for {
      data <- myService.fetch(id).eitherT
      values <- anotherService.fetch(data.id).eitherT
      // Traverse is not available for Seq, it requires some specific data e.g. List
      result <- values.toList.traverse(value => service.moreAction(value).eitherT)
    } yield result
    

    【讨论】:

      猜你喜欢
      • 2019-04-09
      • 2018-06-15
      • 2021-03-17
      • 1970-01-01
      • 2021-12-28
      • 2019-05-12
      • 1970-01-01
      • 2019-05-19
      • 2019-05-21
      相关资源
      最近更新 更多