尝试使用map(第6行)而不是Await(第3-4行)会导致编译失败,提示无法解析标记为第一行的重载方法“ Action”。 我认为问题出在使用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行取消注释时):
编译错误[类型不匹配; 找到:play.api.data.Form [controllers.UserForm.Data] => scala.concurrent.Future [play.api.mvc.Result] 必需:play.api.data.Form [controllers.UserForm.Data] => play.api.mvc.Result]
答案 0 :(得分:1)
由于您正在使用同步操作并传递Future,因此编译失败。为了使该行正常工作,您需要将您的操作更改为异步操作,它应该像这样简单:
Action.async {/*your code here*/}