我正在關注這個。我的程式結構是:
(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 鏈接起來以進行理解。
什么是慣用的做法?
uj5u.com熱心網友回復:
在 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/394695.html
