【发布时间】:2016-09-17 06:56:42
【问题描述】:
我有一个处理表单提交的操作。在验证表单之前,我需要解析两个 Futures。我以为我可以嵌套所有内容,这意味着将 fold 放在 for 理解的 yield 块中。
例如:
def handleFormSubmission = silhouette.SecuredAction.async { implicit request =>
for {
user <- userService.findOneByUserId(userId)
avatar <- avatarService.findOneByUserId(userId)
} yield {
myForm.bindFromRequest.fold(
formWithErrors => formWithErrorsBranch(formWithErrors, user, avatar),
changeData => changeDataBranch(changeData, user, avatar))
}
}
两个分支都返回Future[Result],fold 的签名是def fold[R](hasErrors: Form[T] => R, success: T => R): R。据我了解,fold 接受两个带有参数Form[T] 和T 的函数,并且都返回R。这意味着如果我在两个分支中返回 Future[Result],fold 也将返回 Future[Result]。但是,由于它包含在 for comprehension 中以解析 Futures user 和 avatar,因此我不需要 Future[Result] 而是 Result。那是对的吗?如果是这样,如何以非阻塞方式修复以下编译错误?
type mismatch;
found : scala.concurrent.Future[play.api.mvc.Result]
required: play.api.mvc.Result
【问题讨论】:
标签: scala playframework akka playframework-2.2