我们的应用使用大量Future[Either[Error, R]]
来返回结果或错误对象。我想创建一个合并两者的新类,以便它可以用于for-comprehensions,即如果函数成功(返回一个Right),则调用下一个函数,否则返回Error。
我已完成map
方法,但在使用flatMap
方面遇到了问题。
class FutureEither[L, R](val future: Future[Either[L, R]]) {
def map[S](f: R => S)(implicit executor: ExecutionContext): FutureEither[L, S] = {
val result = future.map {
case Right(r) => Right(f(r))
case Left(error) => Left(error)
}
new FutureEither(result)
}
def flatMap[S](f: R => FutureEither[L, S])(implicit executor: ExecutionContext): FutureEither[L, S] = ???
}
如果有人可以帮助我实施它,或者总体改进建议,那会很棒。
答案 0 :(得分:1)
几乎相同,只需future.flatMap
代替future.map
。并在以后包装左侧案例:
def flatMap[S](f: R => FutureEither[L, S])(implicit executor: ExecutionContext): FutureEither[L, S] = {
new FutureEither(future.flatMap{
case Right(r) => f(r).future
case Left(error) => Future(Left(error))
})
}