Scala提取物来自未来

时间:2015-11-28 22:18:56

标签: scala playframework playframework-2.0

我是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?
    });
  }

2 个答案:

答案 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
})