Scala cats 使用键->值对映射 EitherT Futures
Scala cats map EitherT Futures with key->value pairs
我有点卡住了,但也许有人可以帮助我。
我有一个 ID 列表,我想 API 调用:
val ids:List[String] = List("id1","id2","id3", "id4")
而这个 api 方法 returns 一个 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
当我输入问题时。触发了一些东西,我实际上已经使用 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))
}
这似乎如我所愿。我愿意接受改进/建议
编辑:
的建议
ids.traverse(id => apiv4.recordById(id).value.map(id -> _))
我有点卡住了,但也许有人可以帮助我。
我有一个 ID 列表,我想 API 调用:
val ids:List[String] = List("id1","id2","id3", "id4")
而这个 api 方法 returns 一个 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
当我输入问题时。触发了一些东西,我实际上已经使用 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))
}
这似乎如我所愿。我愿意接受改进/建议
编辑:
的建议ids.traverse(id => apiv4.recordById(id).value.map(id -> _))