我试图在一个方法中调用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
。
答案 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)
关于你的书面代码的一些事情:
在外部未来通话中使用Flatmap :您有asynchronous
个动作,每个ws
通话类型应该具有Future
类型,因此外部map
应flatMap
,以避免与Future[Future[...]]
打交道。
不要使用var :函数式编程的重点是不变性使用val代替。如果你能'考虑一下你的架构/设计并重新实现书面功能。
将动作响应移动到地图主体:为了更清晰的方法,为什么不将Ok
响应移动到第二个地图的主体?