簡體   English   中英

scala-cats EitherT:鏈接期貨

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM