繁体   English   中英

scala-cats EitherT:链接期货

[英]scala-cats EitherT: chaining futures

我正在关注这个 我的程序结构是:

(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 链接起来以供理解。

什么是惯用的做法?

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

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

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

(把它想象成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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM