在游戏框架中等待未来的响应

时间:2014-05-30 23:48:32

标签: scala playframework-2.2 synchronized

我正在尝试构建一个服务,从另一个Web服务中获取一些页面并处理内容并将结果返回给用户。我正在使用Play 2.2.3 Scala。

val aas = WS.url("http://localhost/").withRequestTimeout(1000).withQueryString(("mid", mid), ("t", txt)).get

val result = aas.map {
    response =>
      (response.json \ "status").asOpt[Int].map {
        st => status = st
      }
      (response.json \ "msg").asOpt[String].map {
        txt => msg = txt
      }
  }
  val rs1 = Await.result(result, 5 seconds)

  if (rs1.isDefined) {
      Ok("good")
  }

问题是即使WS请求需要100 ms,服务也会等待5秒钟才能返回“good”。我也无法将Await时间设置为100ms,因为我请求的其他Web服务可能需要100ms到1秒才能响应。

我的问题是:有没有办法在准备好后立即处理和提供结果,而不是等待一段固定的时间?

1 个答案:

答案 0 :(得分:4)

@wingedsubmariner已经提供了答案。由于没有代码示例,我将发布它应该是什么:

def wb = Action.async{ request =>
    val aas = WS.url("http://localhost/").withRequestTimeout(1000).get

    aas.map(response =>{
         Ok("responded")
    })
}

现在您不需要等到WS响应然后决定要做什么。你可以告诉游戏在做出回应时做些什么。