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