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
我正在关注 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