我们使用 Twitter 期货(作为 Finagle 堆栈的一部分),我不喜欢使用(业务)异常来控制应用程序流的概念,因为异常不会出现在方法签名中。
所以我有了用 Future[Either[A,B]] 作为替代的想法。
但是我在使用这个概念对期货进行理解时遇到了一些问题:
例如,我们有一个存储库方法:
def getUserCredentialsByNickname(nickname: String): Future[Either[EntityNotFound, UserCredentials]]
和一个处理程序方法,它使用这个 repo 并执行一些其他检查并创建一个令牌
def process(request: LoginRequest): Future[Either[Failure, Login]] = {
for {
credentialsEither <- userRepository.getUserCredentialsByNickname(request.username)
...several other calls/checks which should 'interrupt' this for comprehension
token <- determineToken(credentials)
} yield token
getUserCredentialsByNickname(..) 之后的 for comprehension 中的调用仅应在此调用返回 Right[UserCredentials] 时执行,而且每个返回的 Either 的详细错误信息也应从处理程序返回。