scala、play、futures:合并多个futures的结果

scala、play、futures:合并多个futures的结果,scala,asynchronous,playframework,future,playframework-2.1,Scala,Asynchronous,Playframework,Future,Playframework 2.1,我正在使用: Scala 2.10 重头戏2.1 目前,我正在使用scala.concurrent.中的Future类,但我愿意尝试其他API 我无法将多个期货的结果合并到一个列表[(字符串,字符串)] 以下Controller方法成功地将单个Future的结果返回到HTML模板: def test = Action { implicit request => queryForm.bindFromRequest.fold( formWithErrors =>

我正在使用:

  • Scala 2.10
  • 重头戏2.1
目前,我正在使用
scala.concurrent.
中的
Future
类,但我愿意尝试其他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调用并返回未来的[play.API.libs.ws.Response]。方法
getAuthors(String,List[(String,String)])
将列表[(String,String)]返回给HTML模板

现在,我尝试在
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))
        }
      })
  }
def test=Action{implicit request=>
queryForm.bindFromRequest.fold(
formWithErrors=>Ok(“错误!”),
查询=>{
异步的{
val=用于(i)
getAuthors(response.body,List[(String,String)]())
}
Ok(views.html.form(queryForm,authors))
}
})
}
类型不匹配;找到:scala.collection.immutable.IndexedSeq[scala.concurrent.Future[List[(字符串,字符串)]]]必需:List[(字符串,字符串)]


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

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

发件人:

在游戏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
F.Promise promises=F.Promise.waitAll(remoteCall1、remoteCall2、remoteCall3);
//其中remoteCall1..3是承诺
List httpResponses=await(promissions);//请求在此处被挂起
在游戏2中,不那么直接:

    val httpResponses = for {
  result1 <- remoteCall1
  result2 <-  remoteCall2
} yield List(result1, result2)
val httpResponses=for{

结果1hm,这个链接很有用。我尝试了朱利安·理查德·福伊发布的方法:
val-httpResponses=Promise.sequence(List(remoteCall1,remoteCall2))
。这让我获得了
Future[IndexedSeq[Response]
的一个实例,这太棒了。不过,我仍在尝试将响应列表映射到单个响应列表中[(字符串,字符串)]。现在,它只映射第一个Future@DavidKaczynski在我的Java应用程序中,我们最终编写了一个小型Promise库,并创建了一个
Promise.whenAll(Promise…
方法。因此,在研究您的问题时,我尝试在谷歌上搜索“scala play Promise from collection”、“…from list”这样的方法我真的希望是非常标准的。另请看:经过进一步检查,我在第一条评论中描述的方法有效。我还有另一个“错误”这只是从一个未来返回结果。一旦我从一系列不同的未来中创造了一个承诺,我就在一个未来得到了所有的回应。太棒了!