【问题标题】:Scala/Play/Akka: delay action responseScala/Play/Akka:延迟动作响应
【发布时间】:2014-02-23 12:03:13
【问题描述】:

我有一个简单的 Play 应用程序,其中控制器操作调用模型方法,该方法进行一些计算并返回结果。我需要的是随机延迟 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 的回答有效,但带有弃用警告。此代码与 Play 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(_))

}

【问题讨论】:

    标签: scala concurrency playframework playframework-2.0


    【解决方案1】:

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

    【讨论】:

    • 谢谢,一切正常。不过,请注意 - 我收到了警告 method Async in trait Results is deprecated: Use Action.async to build async actions instead。现在我有一个更清晰的想法,我会看看我是否可以解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多