scala-cats EitherT:链接期货

scala-cats EitherT: chaining futures

我正在关注 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 returns 未来[...]。

anotherService.fetch 也 returns Future[...],values 是一个 Seq。 我想使用 foreach

处理值中的条目
values.foreach(value => service.moreAction(value))

更多行动也returns未来[...]

因此我的目标是将它与之前的 Futures 联系起来以供理解。

惯用的方法是什么?

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

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

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

(把它想象成 Future.sequence 的泛化,它采用 Seq[Future[A]] 和 returns 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