当前位置: 首页 > 知识库问答 >
问题:

scala、play、期货:组合多个期货的结果

东方嘉木
2023-03-14

我正在使用:

  • Scala 2.10
  • 游戏2.1

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

我很难将多个期货的结果组合成一个列表[(String, String)]。

以下 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)]) 向 HTML 模板返回 List[(String, String)]。

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

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

类型不匹配;found:Scala . collection . immutable . indexed seq[Scala . concurrent . future[List[(String,String)]]]必需:List[(String,String)]

如何将多个未来对象的响应映射到单个结果

共有1个答案

汝墨一
2023-03-14

创建由结果类型的列表或其他集合参数化的未来。

从这里:

在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

在剧本2中不太直接:

    val httpResponses = for {
  result1 <- remoteCall1
  result2 <-  remoteCall2
} yield List(result1, result2)
 类似资料:
  • 在用收益结构组合期货时,有些有副作用,有些没有,我引入了竞争条件,因为取决于副作用的未来并没有将副作用的结果作为论据。 简而言之: 未来b读取由来自未来a的副作用改变的值,但是未来a不明确依赖于未来b的结果,因此可能在b完成读取之前发生。 为了解决这个问题,我的同事引入了一个虚拟函数,将b的结果作为参数并简单地将其丢弃。这样做是为了使依赖显式化。 实际代码如下: 在这种情况下,未来 b 为 带哑参

  • 我有两个在未来发生的计算,如下所示: 我希望它能够运行,以便comp2总是在comp1完成后运行!我知道使用一个表达,我可以组成这两个Future的喜欢。 什么能保证comp1在comp2之前完成?我的意思是这些是发生在不同线程中的计算,并且不能保证运行的顺序。有没有一种方法可以保证没有阻塞的顺序?

  • 我使用 并行运行 2 个期货。我想知道在所有情况下哪个成功了,哪个失败了(所有情况都应该运行到完成,并显示结果或失败状态)。目前,我只能检索到综合成功结果 我从这里开始操作,但这还不够,因为我无法获得单个失败时的成功状态,也无法获得两个失败时的失败状态。在Scala未来的理解中,两个失败都是失败的 我试图避免这种混乱: 编辑:另一个版本-这是一个有效的方法吗?

  • 我是Scala未来的新手,我还没有找到问题的解决方案。我正在努力实现以下目标(总体描述:努力获取一个酒店列表的客人列表,分别查询每个酒店): < li >对另一个API进行n次调用,每次调用都超时 < li >合并所有结果(将列表转换为包含所有元素的列表) < li >如果单个调用失败,记录错误并返回一个空列表(本质上,在这种情况下,如果我得到部分结果总比没有结果好) < li >理想情况下,如果

  • 在这种情况下,我的做法是使用 将 转换为 。然后使用 获取结果。但是,可能有一个任务需要很长时间并且超时。在这种情况下,我仍然希望获得其余结果(同时并行运行所有任务)。可能吗?怎么办? 谢谢

  • 我正在努力理解这个概念。我清楚地了解期货是什么。我对Promises有点困惑。下面的代码片段: 现在,以下两个代码片段之间有什么区别? 和 我对第一个的理解是,p成功将完成与该p相关的未来计算。计算是异步的吗?这与使用 Future 块完成与 Promise p 关联的 Future f 的第二个代码片段有何不同?