【问题标题】: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
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-08
        • 1970-01-01
        • 2017-03-29
        • 2016-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多