【发布时间】:2020-06-22 17:07:05
【问题描述】:
尝试使用 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]
【问题讨论】:
-
建议先阅读文档
标签: scala playframework