【发布时间】:2016-01-24 10:29:28
【问题描述】:
我有以下方法可以对Futures 进行一些处理:
def registerNewUser(user: User): Future[Either[ServiceError, User]] = async {
val encryptedUser =
user.copy(encrypt(user))
def checkResultAndFetchUser(result: WriteResult, encryptedEmail: String): Future[Either[ServiceError, User]] = {
if (result.hasErrors)
Future.successful(Left(ServiceError(result.writeErrors.map(_.errmsg).toString)))
else
userByEmail(encryptedEmail)
}
def handleInsertError(result: WriteResult): Either[ServiceError, User] = {
if (result.code contains 11000)
Left(ServiceError("Email already exists"))
else
Left(ServiceError(result.writeErrors.map(_.errmsg).toString))
}
val result = userCollection.insert(encryptedUser).map( writeRes =>
checkResultAndFetchUser(writeRes, encryptedUser.email)
).recover {
case res: WriteResult => Future.successful(handleInsertError(res))
}
await(result.flatMap(fut => fut))
}
这是我的问题:
checkResultAndFetchUser方法中使用了encryptedUser局部变量,userCollection.insert(encryptedUser)返回一个Future,因此有可能在checkResultAndFetchUser中捕获另一个encryptedUser方法?那意味着,我注定要失败!这是处理
Futures 及其处理的好方法吗?
【问题讨论】: