播放Scala将同步转换为异步

时间:2015-06-09 15:44:28

标签: multithreading scala asynchronous playframework

我一直试图将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 ("'")
  }

请帮助:)

1 个答案:

答案 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))))
        }
      }
    }
  )
}