Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala/Play/Akka:延迟动作响应_Scala_Concurrency_Playframework_Playframework 2.0 - Fatal编程技术网

Scala/Play/Akka:延迟动作响应

Scala/Play/Akka:延迟动作响应,scala,concurrency,playframework,playframework-2.0,Scala,Concurrency,Playframework,Playframework 2.0,我有一个简单的Play应用程序,其中控制器动作调用model方法,该方法执行一些计算并返回结果。我需要的是动作响应随机延迟1-5秒。我对Akka几乎没有经验,但我不知道如何完成我需要的 控制器示例: package controllers import scala.util.Random import play.api._ import play.api.mvc._ import models.MyModel object Application extends Controlle

我有一个简单的Play应用程序,其中控制器动作调用model方法,该方法执行一些计算并返回结果。我需要的是动作响应随机延迟1-5秒。我对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

    }

}
更新-解决方案senia的答案有效,但带有反对警告。该代码符合第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(_))

}
请参阅play framework文档中的暂停/处理超时

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(_)}

}

谢谢,这很好用。不过需要注意的是,我在trait Results中得到一个警告
方法Async已被弃用:使用Action.Async来构建异步操作。现在我有了更清楚的想法,我会看看我是否能解决这个问题。