使用动作合成时Play2异步

时间:2013-02-02 13:29:41

标签: asynchronous playframework-2.0

在Play2中,我理解了动作组合的概念,并使用Async {...}进行异步响应,但我没有看到这些方法一起使用的示例。

要明确的是,假设您正在使用动作合成来确保用户通过身份验证:

  def index = Authenticated { user =>
   Action { request =>
     Async {
        Ok("Hello " + user.name)      
     }
   }
  }

Authenticated的实现中,如果我们假设这个数据库正在被查找以检索用户,那么在我看来这部分将是一个阻塞调用,只留下{ {1}}身体为非阻挡。

有人可以解释我如何能够执行包含身份验证部分的非阻塞异步I / O吗?

2 个答案:

答案 0 :(得分:0)

我的解决方案是内外构建动作,如下:

def index = Action { request =>
  Async {
    Authenticated { user =>
      Ok("Hello " + user.name)      
    }
  }
}

我的Authenticated签名看起来像是:

def Authenticated(body: => Result): Result = {
  // authenticate, and then
  body
}

这里的缺点是身份解析将在身份验证之前进行,这对您来说可能是也可能不是问题。

答案 1 :(得分:0)

我可以举一个完整的例子:http://pastebin.com/McHaqrFv

它的本质是:

  def WithAuthentication(f: WithAuthentication => Result) = Action {
    implicit request => AsyncResult {
      // async auth logic goes here
    }
  }

简单地在控制器中:

  def indexAction = WithAuthentication {
    implicit request =>
      Ok(views.html.index())
  }

甚至:

  def someAction = WithAuthentication {
    implicit request => Async {
      // more async logic here
    }
  }

这是一个模板友好的解决方案,随时可以使用它。也许有时候我会从中创建一个插件。刚刚编写了我的应用程序,到目前为止似乎有效。