在Play Scala中处理多个Api调用和全局变量

时间:2018-01-30 06:42:52

标签: scala playframework

我试图在一个方法中调用2个apis,我必须根据我得到的响应进行一些计算。

到目前为止,我已经尝试了

def sortedRes() = Action.async {
    ws.url(url).get().map { response =>
      val value: JsValue = Json.parse(response.body)
      val headVal = value.get.head
      ws.url(sortUrl).get().map { response =>
        val sorted: JsValue = Json.parse(response.body)
        var sortedResult = sorted.get.head
      }
      println("----------------------")
      println(headVal)
      println(sortedResult)
      Ok(Json.toJson(sortedResult)
    }
  }

我在println(sortedResult)行收到错误,因为它在那里不可用。如何在scala中访问sortedResult

2 个答案:

答案 0 :(得分:1)

由于ws.url(whatever).get()是异步的,它会返回一个包含您的回复的Future,因此在您想要打印它时它就不可用。

您必须flatMap外部Future才能管理内部sortedResult,因此您的def sortedRes() = Action.async { ws.url(url).get().flatMap { response => val value: JsValue = Json.parse(response.body) val headVal = value.get.head ws.url(sortUrl).get().map { response => val sorted: JsValue = Json.parse(response.body) val sortedResult = sorted.get.head println("----------------------") println(headVal) println(sortedResult) Ok(Json.toJson(sortedResult) } } } 将可用

我认为这就是你想要做的事情:

git clone https://github.com/git/git

答案 1 :(得分:1)

关于你的书面代码的一些事情:

  1. 在外部未来通话中使用Flatmap :您有asynchronous个动作,每个ws通话类型应该具有Future类型,因此外部mapflatMap,以避免与Future[Future[...]]打交道。

  2. 不要使用var :函数式编程的重点是不变性使用val代替。如果你能'考虑一下你的架构/设计并重新实现书面功能。

  3. 将动作响应移动到地图主体:为了更清晰的方法,为什么不将Ok响应移动到第二个地图的主体?