2014-02-23 46 views
2

我有一個簡單的Play應用程序,其中一個控制器動作調用模型方法,它執行一些計算並返回結果。我需要的是動作響應在1-5秒之間隨機延遲。我對阿卡沒有什麼經驗,但我不知道如何完成我所需要的。Scala/Play/Akka:延遲動作響應

例控制器:

package controllers 

import scala.util.Random  
import play.api._ 
import play.api.mvc._ 

import models.MyModel 

object Application extends Controller { 

    def calculate = Action { implicit request => 

     val result = MyModel.calculate() 
     val delay = Random.nextInt(6) 

     //This response must be delayed somehow 
     Ok(result) 

    } 

} 

實例模型:

package models 

object MyModel { 

    def calculate = { 

     //calculation happens here 

    } 

} 

更新 - 解塞尼亞的回答是工作,但棄用警告。此代碼同意播放2.2.1:

import play.api.libs.concurrent.Promise 
import play.api.libs.concurrent.Execution.Implicits.defaultContext 

def calculate = Action.async { 

    val result = MyModel.calculate() 
    val delay = Random.nextInt(6) 
    val delayed = Promise.timeout(result, delay.second) 
    delayed.map(Ok(_)) 

} 

回答

3

Handling asynchronous results /處理超時播放框架文檔。

def calculate = Action.async { implicit request => 

    import play.api.libs.concurrent.Execution.Implicits.defaultContext 
    import scala.concurrent.duration._ 

    val result = MyModel.calculate() 
    val delay = Random.nextInt(6) 

    val delayed = play.api.libs.concurrent.Promise.timeout(result, delay.seconds) 

    delayed.map{Ok(_)} 

} 
+0

謝謝,這工作得很好。一個注意雖然 - 我收到一個警告'方法異性結果不推薦使用:使用Action.async來建立異步操作。我會看看現在是否可以解決這個問題,我有一個更清晰的想法。 – Caballero

+0

@Caballero:查看更新 – senia