假设我有以下内容:
val ints: Seq[Int] = ???
def foo(i: Int): EitherT[Future, Error, Seq[String]] = ???
我想用foo
调用ints
并累积Seq[String]
结果以最终返回EitherT[Future, Error, Seq[String]]
。
ints.map(i => foo(i))
很明显,以上返回Seq[EitherT[Future, Error, Seq[String]]]
,但这不是我想要的。当foo
在Error
中首次返回map
时,我想停止遍历并返回错误。
实现我的目标的正确方法是什么?
答案 0 :(得分:1)
ints.map(foo).reduce(for { a <- _ ; b <- _ } yield a ++ b)
这基本上可以满足您的要求,但我认为这不完全符合该句子的要求:
当foo在地图中首次返回Error时,我想 停止遍历并返回错误。
问题在于您需要在任何期货完成之前遍历seq,因此您不知道它们是否返回错误。您可以一个一个地“阻塞”,而在上一个操作完成之前不进行对foo
的下一个调用,但是这样您就不会获得任何并行性。从理论上讲,有可能先启动所有这些期货,然后在一个错误返回时取消仍在运行的期货,但是不幸的是,取消期货并不是一件容易的事。