Action blocked, and it takes a function from Request=>Result , so you can do any blocking things in it. Action.async is non-blocking and requires a function from Request=>Future[Result] , but here it is important to understand that only non-blocking material in it matters, because if you block some where next, it will be pointless. The WS call mentioned by @Christopher Hunt is a good example because it gives you a future [Answer] that you can easily convert to Future[Result] what Action.async expects as a return type. But you can use the scala.Future API for any material that can be asynchronous and non-blocking.
source share