2013-02-24 78 views
10

我使用來自多個期貨相結合的結果:階,發揮期貨:

  • 斯卡拉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

回答

9

創建一個由列表或結果類型的其他集合參數化的Future。

here

在播放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) 
+0

嗯,那個鏈接幫助。我嘗試了Julian Richard-Foy發佈的方法:'val httpResponses = Promise.sequence(List(remoteCall1,remoteCall2))'。這讓我得到了一個'Future [IndexedSeq [Response]]'的實例,這非常棒。但是,我仍然試圖將響應列表映射到[(String,String)]的單個列表中。現在,它只映射第一個Future的結果 – 2013-02-24 02:17:52

+0

@DavidKaczynski在我的Java應用程序中,我們寫了一個小的Promise庫並創建了一個'Promise.whenAll(Promise ...)'方法。因此,在研究你的問題時,我嘗試了Google的搜索功能,例如「scala玩遊戲承諾」,「...從列表中刪除」等等。我真的希望這種方法非常標準。另請參閱:https://github.com/playframework/Play20/pull/677 – djechlin 2013-02-24 02:49:06

+0

經過進一步檢查,我在第一條評論中描述的方法奏效。我有另一個「錯誤」,只是從一個未來返回結果。一旦我從一系列不同的**期貨中創造了一個承諾,我就在單一的未來中獲得了所有的答覆。棒極了! – 2013-02-24 20:31:17