我一直试图将Action与Action异步相结合。我想知道如何运行一个单独的异步线程来从服务器检索一些数据,并根据该结果异步执行重定向或坏请求。现在我必须在主线程上发送一个状态代码,但是异步线程没有做任何事情。我不知道为什么。
下面是代码:
def submitAuth = Action { implicit request =>
loginForm.bindFromRequest.fold(
errors => BadRequest(views.html.home.index(errors)),
{
case (loginUser) =>
val result = Action.async {
for {
userCheck <- getUser(loginUser.email, loginUser.password)
} yield {
if(userCheck){
Redirect(routes.jobs.index()).addingToSession("email" -> loginUser.email)
} else {
BadRequest(views.html.home.index(loginForm.bindFromRequest.withGlobalError(Messages("error.login", email))))
}
}
}
})
Ok ("'")
}
请帮助:)
答案 0 :(得分:1)
使用Action.async
在异步方法中包装整个操作通常更容易。然后,对于任何不是真正异步的返回结果,您可以将它们包装在Future.successful
调用中(就像您的错误结果一样)。否则,映射异步调用并返回结果效果很好。请参阅下文(假设getUser
调用返回Future[Boolean]
):
def submitAuth = Action.async { implicit request =>
loginForm.bindFromRequest.fold(
errors => Future.successful(BadRequest(views.html.home.index(errors))),
{
case (loginUser) =>
getUser(loginUser.email, loginUser.password) map { userCheck =>
if(userCheck){
Redirect(routes.jobs.index()).addingToSession("email" -> loginUser.email)
} else {
BadRequest(views.html.home.index(loginForm.bindFromRequest.withGlobalError(Messages("error.login", email))))
}
}
}
)
}