【问题标题】:Scala extract result from futureScala从未来提取结果
【发布时间】:2016-03-02 19:38:05
【问题描述】:
我是 Scala 的新手,玩和使用 Futures。
我有以下 Play 类,它进行 API 调用并将结果封装在 Future 中。
如何从 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?
});
}
【问题讨论】:
标签:
scala
playframework
playframework-2.0
【解决方案1】:
尽量避免从未来提取结果。为此,您可以使用 for 理解来链接未来的调用:
val chainResult = for {
result1 <- apiCallReturningFuture1;
result2 <- apiCallReturningFuture2(result1)
} yield result2
在给定的示例中,result1 是 Future apiCallReturningFuture1 的“提取”结果。获得 result1 后,它会传递给对 apiCallReturningFuture2 的调用,并将“解包”传递给 result2。最后,chainResult 是一个未来的包装 result2,它仍然是 Future!通过您的 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
}
}
所以我不建议在期货上等待,除非在测试中等待
【解决方案2】:
future.onSuccess({
case result => result.json
})