Scala 播放框架-使表单验证异步-编译错误

Scala 播放框架-使表单验证异步-编译错误,scala,playframework,Scala,Playframework,尝试使用映射行6而不是使用等待行3-4会导致编译中出现无法解析标记第一行的重载方法“Action”。 我认为问题出在使用fold的函数的最后一行,它现在有另一个errorFunction返回的值类型。 有人能帮助理解发生了什么以及如何使create用户完全异步吗 def createUser = Action { implicit request: MessagesRequest[AnyContent] => val errorFunction = { formWithErrors

尝试使用映射行6而不是使用等待行3-4会导致编译中出现无法解析标记第一行的重载方法“Action”。 我认为问题出在使用fold的函数的最后一行,它现在有另一个errorFunction返回的值类型。 有人能帮助理解发生了什么以及如何使create用户完全异步吗

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]

编译失败,因为您正在使用同步操作,并传递一个未来。要使该行正常工作,您需要将您的操作更改为异步操作,操作应如下所示:


Action.async{/*此处的代码*/}

现在有:类型不匹配;找到:controllers.UserForm.Data=>play.api.mvc.Result所需:controllers.UserForm.Data=>scala.concurrent.Future[play.api.mvc.Result]您是否更改为Action.async并取消了该行的注释?啊,我明白了,您还需要在success函数中返回Future,尝试用futuraturanks包装重定向部分,效果良好。更一般的问题:操作本质上不应该是异步的?我现在在successFunction中有以下内容:usersDao.createuser.map=>Redirectroutes.UserController.listUsers.flashingInfo->user added!create可能会抛出异常,您将如何处理它并保留所需的返回值类型?建议先阅读文档