我正在使用:
- Scala 2.10
- Play 2.1
目前,我正在使用scala.concurrent._
中的Future
类,但我愿意尝试其他API。
我遇到了将多个futures的结果合并成单个List [(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)]())))
}
}
})
}
The method
getSearchResult(String, Int)
执行Web服务API调用并返回Future [play.api.libs.ws.Response]。方法getAuthors(String, List [(String, String)])
将返回一个List [(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))
}
})
}
类型不匹配;找到:scala.collection.immutable.IndexedSeq [scala.concurrent.Future [List [(String,String)]]],需要:List [(String,String)]。
我如何将多个Future对象的响应映射到单个Result?
val httpResponses = Promise.sequence(List(remoteCall1, remoteCall2))
。这让我得到了一个Future[IndexedSeq[Response]]
实例,非常棒。然而,我仍在努力将响应列表映射为单个[(String, String)]列表。现在,它只映射第一个Future的结果。 - David KaczynskiPromise.whenAll(Promise...)
方法。因此,在研究您的问题时,我尝试通过 Google 搜索 "scala play promise from collection," "...from list" 等内容。我真的希望这样的方法非常标准化。另请参见:https://github.com/playframework/Play20/pull/677 - djechlin