我使用來自多個期貨相結合的結果:階,發揮期貨:
- 斯卡拉2.10
- 播放2.1
目前,我正在使用從scala.concurrent._
的Future
類,但我可以嘗試另一種API。
我無法將多個期貨的結果合併成一個List [(String,String)]。
以下Controller
方法成功單個未來結果返回給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的方法。響應]。方法getAuthors(String, List[(String, String)])
向HTML模板返回一個List [(String,String)]。
現在,我想在for
循環中調用getSearchResult(String, Int)
以獲得多個Response實體。下面應該給的什麼,我試圖做一個想法,但我得到一個編譯時錯誤:
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 [列表[(字符串,字符串)]]]要求:列表[(字符串,字符串)]
我怎麼能映射的幾個答覆Future
對象到單個Result
?
嗯,那個鏈接幫助。我嘗試了Julian Richard-Foy發佈的方法:'val httpResponses = Promise.sequence(List(remoteCall1,remoteCall2))'。這讓我得到了一個'Future [IndexedSeq [Response]]'的實例,這非常棒。但是,我仍然試圖將響應列表映射到[(String,String)]的單個列表中。現在,它只映射第一個Future的結果 – 2013-02-24 02:17:52
@DavidKaczynski在我的Java應用程序中,我們寫了一個小的Promise庫並創建了一個'Promise.whenAll(Promise ...)'方法。因此,在研究你的問題時,我嘗試了Google的搜索功能,例如「scala玩遊戲承諾」,「...從列表中刪除」等等。我真的希望這種方法非常標準。另請參閱:https://github.com/playframework/Play20/pull/677 – djechlin 2013-02-24 02:49:06
經過進一步檢查,我在第一條評論中描述的方法奏效。我有另一個「錯誤」,只是從一個未來返回結果。一旦我從一系列不同的**期貨中創造了一個承諾,我就在單一的未來中獲得了所有的答覆。棒極了! – 2013-02-24 20:31:17