[英]Play framework - make form validation async - compilation error
尝试使用 map(第 6 行)而不是使用 Await(第 3-4 行)会导致编译显示无法解析重载方法“Action”标记第一行。 我认为问题出在 function 的最后一行使用 fold,它现在有另一个从 errorFunction 返回的值类型。 有人可以帮助了解正在发生的事情以及如何使创建用户完全异步吗?
def createUser = Action { implicit request: MessagesRequest[AnyContent] =>
val errorFunction = { formWithErrors: Form[Data] =>
val readAllResponse = Await.result(usersDao.readAll(), Duration.Inf)
BadRequest(views.html.listUsers(readAllResponse, formWithErrors, postUrl))
// TODO - try to make it async.
// usersDao.readAll().map(allUsersList => BadRequest(views.html.listUsers(allUsersList, formWithErrors, postUrl)))
}
val successFunction = { data: Data =>
val user = User(id = data.id, firstName = data.firstName, lastName = data.lastName)
// call to DAO
val createUsers: Future[User] = usersDao.create(user)
Redirect(routes.UserController.listUsers()).flashing("Info" -> "user added!")
}
val formValidationResult = form.bindFromRequest
formValidationResult.fold(errorFunction, successFunction)
}
readAll() 的代码:
def readAll()(implicit transaction: Transaction[User]): Future[List[User]] = Future {
println(s"Reading all users...")
Thread.sleep(500)
transaction.modelObjectsList.toList
}
错误(取消注释第 6 行时):
编译错误[类型不匹配; found: play.api.data.Form[controllers.UserForm.Data] => scala.concurrent.Future[play.api.mvc.Result] required: play.api.data.Form[controllers.UserForm.Data] => [play.api.mvc.Result]
编译失败,因为您使用的是同步操作,并传递了一个 Future。 要使该行起作用,您需要将 Action 更改为 async Action,它应该像这样简单:
Action.async {/*your code here*/}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.