如何实现Future的flatMap方法[[L,R]]

时间:2017-12-11 20:39:13

标签: scala

我们的应用使用大量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] = ???
}

如果有人可以帮助我实施它,或者总体改进建议,那会很棒。

1 个答案:

答案 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))
  })
}