【发布时间】:2020-07-12 18:07:23
【问题描述】:
考虑场景
trait Checker {
def check()(implicit ec: ExecutionContext): Future[Either[String, Unit]]
}
这个 trait 由各种类实现。
让我们说
class CheckerImpl1 extends Checker {
override def check()(implicit ec: ExecutionContext): Future[Either[String, Unit]] = ???
}
class CheckerImpl2 extends Checker {
override def check()(implicit ec: ExecutionContext): Future[Either[String, Unit]] = ???
}
现在,我需要定义一个新函数,它将按顺序为这些实现类中的每一个调用check() 函数(顺序无关紧要)并返回一个新的,即Future[Either[String, Unit]],这里的String 是@ 的串联字符串987654325@为check()实现结果。
所以如果CheckerImpl1.check() 返回Left("error1") 并且CheckerImpl2.check() 返回Left("error2"),那么新函数的结果将返回Left("error1&error2")(并且只是分隔两个字符串)。
或
所以如果CheckerImpl1.check() 返回Right(()) 并且CheckerImpl2.check() 返回Left("error2") 那么新函数的结果将返回Left("error2")。
或
所以如果CheckerImpl1.check() 返回Right(()) 并且CheckerImpl2.check() 返回Right(()),那么新函数的结果将返回Right(())。
我现在做的是
(CheckerImpl1.check(), CheckerImpl2.check())
.mapN {
case (Right(_), Right(_)) => Right(())
case (Left(err), Right(_)) => Left(err)
case (Right(_), Left(err)) => Left(err)
case (Left(err1), Left(err2)) => Left(err1 ++ "&" ++ err2)))
}
但这不是一个理想的解决方案,因为如果我添加更多的实现,那么我需要添加更多的这些 case 语句。
有没有更好的方法?
【问题讨论】: