On Github jamesward / reactive-all-the-way-down
def foo = Action {
  Ok("foo")
}
def foo = Action.async {
    Future.successful(Ok("foo"))
}
def pause(duration: Int) = Action.async {
  Promise.timeout(Ok(duration.toString), duration seconds)
}
val f: Future[Response] = WS.url("http://www.foo.com").get
def foo = Action.async {
  val futureResponse = WS.url("http://www.foo.com").get
  futureResponse.map { response =>
    Ok(response.body)
  }
}
def foo = Action.async {
  val futureJW = WS.url("http://www.jamesward.com").get
  val futureTwitter = WS.url("http://www.twitter.com").get
  for {
    jw <- futureJW
    twitter <- futureTwitter
  } yield Ok(jw.response.body + twitter.response.body)
}
def tweets(q: String) = Action.async {
    val futureResponse = WS.url(s"http://twitter-search-proxy.herokuapp.com/search/tweets?q=$q").get()
    futureResponse.map { response =>
        Ok(JsArray((response.json \\ "text").distinct))
    }
}
"org.webjars" %% "webjars-play" % "2.3-M1", "org.webjars" % "bootstrap" % "3.1.1", "org.webjars" % "angularjs" % "1.2.16"
<link rel="stylesheet" href="@routes.WebJarAssets.at(WebJarAssets.locate("bootstrap.css"))">
<script src="@routes.WebJarAssets.at(WebJarAssets.locate("angular.min.js"))"></script>
<script src="@routes.Assets.at("main.js")"></script>
                    <nav class="navbar navbar-default navbar-static-top" role="navigation">
    <div class="container-fluid">
        <a class="navbar-brand" href="#">Go Reactive</a>
    </div>
</nav>
<div class="container">
    <div ng-controller="Hello">
        <form ng-submit="sendName()">
            <label>Name:</label>
            <input type="text" ng-model="yourName">
            <input class="btn-primary" type="submit" value="Send">
        </form>
        <ul><li ng-repeat="tweet in tweets">{{tweet}}</li></ul>
    </div>
</div>
angular.module('myApp', []).
    controller('Hello', function($scope, $http, $timeout) {
        $scope.msg = "";
        $scope.sendName = function() {
            $http({method: 'GET', url: '/tweets', params: {q: $scope.yourName}}).
                success(function(data) {
                    $scope.tweets = data;
                });
        };
    });
Controller:
def tweets(q: String) = Action.async {
    val actorRef = Akka.system.actorOf(Props[TwitterActor])
    (actorRef ? q).map {
        case j: JsArray => Ok(j)
    }
}
Actor:
def receive = {
    case s: String =>
        val futureResponse = WS.url(s"http://twitter-search-proxy.herokuapp.com/search/tweets?q=$s").get()
        futureResponse.map { response =>
            JsArray((response.json \\ "text").distinct)
        } pipeTo sender
}
future.recover {
    case Exception =>
        Logger.error("Failed!")
        InternalServerError("Boum!")
}
def echoWs = WebSocket.using[String] { request =>
  val (enumerator, channel) = Concurrent.broadcast[String]
  val in = Iteratee.foreach[String](channel.push)
  (in, enumerator)
}
Template:
<h2>{{msg}}</h2>
Controller:
$scope.socket = new WebSocket("ws://localhost:9000/echo-ws");
$scope.socket.onmessage = function(msg) {
    $timeout(function() { $scope.msg = "hello, " + msg.data; });
};
$scope.socket.send($scope.yourName);
Controller:
def echoWs = WebSocket.acceptWithActor[String, String] { request => out =>
    Props(classOf[EchoActor], out)
}
Actor:
class EchoActor(out: ActorRef) extends Actor {
    def receive: Receive = {
        case s: String => out ! s
    }
}
Activator Templates
Other