我是Scala的新手,玩和使用期货。 我有以下Play类,它进行API调用并将结果封装在Future中。
如何从未来提取结果?
class WikiArticle(url : String) {
var future : Future[WSResponse] = null
def queryApi(): Unit = {
val holder : WSRequest = WS.url(url)
future = {
holder.get()
}
future.onSuccess({
//How do I extract the result here?
});
}
答案 0 :(得分:3)
尽量避免从将来提取结果。为此,您可以使用for comprehension链接未来的呼叫:
val chainResult = for {
result1 <- apiCallReturningFuture1;
result2 <- apiCallReturningFuture2(result1)
} yield result2
在给定的示例中,结果1被提取并且#39; Future apiCallReturningFuture1的结果。一旦获得result1,它就会被传递给apiCallReturningFuture2并且打开&#39; unwrapped&#39;结果2。最后,chainResult是未来的包装结果2,它仍然是未来!通过您的API,您可以链接和转换您的未来,而无需等待它的结果
从长远来看,您可能希望在控制器中返回未来的结果。在Play Framework中,您可以使用Action.async:
来完成def load(id:Long) = Action.async {
repository.load(id)
.map {
case Some(x) => Ok(Json.toJson(x))
case None => NotFound
}
}
所以除了等待考试外,我不建议等待期货
答案 1 :(得分:0)
future.onSuccess({
case result => result.json
})