在Play2中,我理解了动作组合的概念,并使用Async {...}进行异步响应,但我没有看到这些方法一起使用的示例。
要明确的是,假设您正在使用动作合成来确保用户通过身份验证:
def index = Authenticated { user =>
Action { request =>
Async {
Ok("Hello " + user.name)
}
}
}
在Authenticated
的实现中,如果我们假设这个数据库正在被查找以检索用户,那么在我看来这部分将是一个阻塞调用,只留下{ {1}}身体为非阻挡。
有人可以解释我如何能够执行包含身份验证部分的非阻塞异步I / O吗?
答案 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
}
}
这是一个模板友好的解决方案,随时可以使用它。也许有时候我会从中创建一个插件。刚刚编写了我的应用程序,到目前为止似乎有效。