scala-cats EitherT:链接期货
Posted
技术标签:
【中文标题】scala-cats EitherT:链接期货【英文标题】:scala-cats EitherT: chaining futures 【发布时间】: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 链接起来以供理解。
什么是惯用的做法?
【问题讨论】:
【参考方案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
【讨论】:
以上是关于scala-cats EitherT:链接期货的主要内容,如果未能解决你的问题,请参考以下文章