Scala猫使用key->值对映射EitherT Futures

时间:2018-04-10 10:13:34

标签: scala functional-programming future scala-cats

我有点卡住,但也许有人可以帮助我。

我有一个ID列表,我想要进行API调用:

val ids:List[String] = List("id1","id2","id3", "id4")

这个api方法返回EitherT[Future, CustomError, JValue]

def recordById(id: String)(implicit ec: ExecutionContext): EitherT[Future, CustomError, JValue]

下面的代码可以按照我的意愿运作:将期货列表排序到列表的未来

val action:Future[List[Either[CustomError,JValue]]] = ids.map(
  id => api.recordById(id).value
).sequence

但我真正想要的是保留id的结果,如:

val action2:Future[List[(String,Either[CustomError,JValue])]] = ids.map(
  id => (id, api.recordById(id).value)
).sequence

1 个答案:

答案 0 :(得分:2)

当我输入问题时。触发的内容我实际上使用traverse代替sequence

val action2:Future[List[(String,Either[CustomError,JValue])]] = ids.map(
  id => (id, apiv4.recordById(id).value)
).traverse{
  case (id, etf) => etf.map(et => (id, et))
}

这似乎按我的意愿行事。我愿意接受改进/建议

修改

Marth

的建议
ids.traverse(id => apiv4.recordById(id).value.map(id -> _))