我对Play如何有点困惑!在其控制器层中工作。一些文档说明Play!始终是异步和非阻塞的。所以我对Action vs Action.async感到困惑。动作阻止了吗?如果是这样,并且docs说你应该始终保持异步和非阻塞,那么你应该总是在所有控制器中使用Action.async吗?你为什么不选择呢?我确信这里有一些我不理解的东西,理解这一点会非常感谢你的任何专业知识。
答案 0 :(得分:5)
Play完全异步且无阻塞。
大多数操作都需要内联执行,因此Play方便地反映了这一点。但是,如果在操作中有异步操作(例如,调用WS),则使用Action.async传回未来的结果。
答案 1 :(得分:1)
Action
正在阻止,它需要来自Request=>Result
的函数,因此您可以在其中执行任何阻止。 Action.async
是非阻塞的,需要来自Request=>Future[Result]
的函数,但重要的是要认识到只有非阻塞的东西才有意义,因为如果你阻止某些东西,那么它将毫无意义。 @Christopher Hunt提到的WS调用是一个很好的例子,因为它为您提供了一个Future [Response],您可以轻松地将Action.async作为返回类型转换为Future[Result]
。但您可以scala.Future API
使用任何可能是异步和异步的内容。无阻塞。