繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM