結果を返すのに時間がかかるデータベースに対して 2 つの呼び出しを行いたいのですが、現在のスレッドをブロックしたくありません。データベース呼び出しをラップするために Akka Futures を使用しました。
両方の呼び出しが戻るのを待つ (ブロックする) 代わりに、呼び出されるコールバック関数を指定して、応答をレンダリングできるようにしたいと考えています。それ、どうやったら出来るの?これが私のコントローラーコードです:
def showPie = IsAuthenticated(Roles.validator) { user => implicit request =>
val eventUid = request.session.get(EventUid).get
val printed = Akka.future(TicketRepository.getCountForState(eventUid, "Printed"))
val validated = Akka.future(TicketRepository.getCountForState(eventUid, "Validated"))
//this would be evil, because it would block: Ok(views.html.pie(printed.await(1000).get, validated.await(1000).get))
//create a promise for all the promised results
val promise = Promise.sequence(List(printed, validated))
//this doesnt work, but how can I make it work WITHOUT blocking this thread?
promise.callWhenResultIsReady(Ok(view.html.pie(promise.get))
}