11

我在用:

  • 斯卡拉 2.10
  • 玩 2.1

目前,我正在使用Future来自 的类scala.concurrent._,但我愿意尝试另一个 API。

我无法将多个期货的结果组合成一个列表 [(字符串,字符串)]。

以下Controller方法成功地将单个 Future 的结果返回到 HTML 模板:

  def test = Action { implicit request =>
    queryForm.bindFromRequest.fold(
      formWithErrors => Ok("Error!"),
      query => {
        Async { 
          getSearchResponse(query, 0).map { response =>
            Ok(views.html.form(queryForm,
              getAuthors(response.body, List[(String, String)]())))
          }
        }
      })
  }

该方法getSearchResult(String, Int)执行 Web 服务 API 调用并返回 Future[play.api.libs.ws.Response]。该方法getAuthors(String, List[(String, String)])返回一个 List[(String, String)] 到 HTML 模板。

现在,我正在尝试循环调用getSearchResult(String, Int)for获取多个响应主体。以下内容应该可以让我了解我正在尝试做的事情,但我得到一个编译时错误:

  def test = Action { implicit request =>
    queryForm.bindFromRequest.fold(
      formWithErrors => Ok("Error!"),
      query => {
        Async {
          val authors = for (i <- 0 to 100; if i % 10 == 0) yield {
            getSearchResponse(query, i)
          }.map { response =>
            getAuthors(response.body, List[(String, String)]())
          }

          Ok(views.html.form(queryForm, authors))
        }
      })
  }

类型不匹配; 找到:scala.collection.immutable.IndexedSeq[scala.concurrent.Future[List[(String, String)]]] 需要:List[(String, String)]

如何将多个Future对象的响应映射到单个对象Result

4

1 回答 1

11

创建由 List 或 Result 类型的其他 Collection 参数化的 Future。

这里

在 Play 1 中,您可以这样做:

    F.Promise<List<WS.HttpResponse>> promises = F.Promise.waitAll(remoteCall1, remoteCall2, remoteCall3);

    // where remoteCall1..3 are promises

    List<WS.HttpResponse> httpResponses = await(promises); // request gets suspended here

在 Play 2 中不那么直接:

    val httpResponses = for {
  result1 <- remoteCall1
  result2 <-  remoteCall2
} yield List(result1, result2)
于 2013-02-24T01:07:58.263 回答