玩 Scala 将同步转换为异步
Play Scala Converting sync to async
我一直在尝试 运行 将 Action 与 Action 异步相结合。我想知道如何 运行 一个单独的异步线程从服务器检索一些数据,并根据该结果异步执行重定向或 badrequest。现在我必须在主线程上发送一个状态码,但是异步线程什么都不做。不知道为什么。
这是代码:
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 ("'")
}
请帮忙:)
使用 Action.async
将整个操作包装在异步方法中通常更容易。然后,对于任何不是真正异步的 return 结果,您可以将它们包装在 Future.successful
调用中(例如您的错误结果)。否则,映射异步调用和 returning 结果效果很好。见下文(假设 getUser
调用 returns a 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))))
}
}
}
)
}
我一直在尝试 运行 将 Action 与 Action 异步相结合。我想知道如何 运行 一个单独的异步线程从服务器检索一些数据,并根据该结果异步执行重定向或 badrequest。现在我必须在主线程上发送一个状态码,但是异步线程什么都不做。不知道为什么。
这是代码:
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 ("'")
}
请帮忙:)
使用 Action.async
将整个操作包装在异步方法中通常更容易。然后,对于任何不是真正异步的 return 结果,您可以将它们包装在 Future.successful
调用中(例如您的错误结果)。否则,映射异步调用和 returning 结果效果很好。见下文(假设 getUser
调用 returns a 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))))
}
}
}
)
}