玩 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))))
        }
      }
    }
  )
}