[英]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.