2013-07-07 33 views
2

我想調用第二個Web服務,其結果來自第一個Web服務。
下面是一些強調我的意圖的代碼。
順便說一句,它在IntelliJ編譯罰款(可能在IDE中的錯誤)。調用依賴於來自其他網絡服務在播放框架中的結果的Web服務

def get = { 
    for { 
     respA <- WS.url(url1).get 
     id <- respA.body.split(",").take(2) 
     respB <- WS.url(url2 + id).get // Here is a compile error 
    } yield { 
     getMyObjects(respB.xml) 
    } 
    } 
  • respA =是逗號分隔的列表與在下次呼叫中使用的ID。
  • respB =是一個XML響應,我的產量的方法

編譯錯誤Play Framework解析給我:

type mismatch; 
found : scala.concurrent.Future[Seq[MyObject]] 
required: scala.collection.GenTraversableOnce[?] 

我找到編譯錯誤奇怪。

  1. [Seq[MyObject]]Future如何存在於該行?
  2. 它應該沒有什麼不同,編譯的兩行代碼不同嗎?

回答

4

WS.url(url1).get回報Future[Response]所以在所有發電機理解應該是期貨。在你的代碼片段中,你在混合Array[String]Future[Response]。關於理解,請參閱Type Mismatch on Scala For Comprehension的一些背景知識。

所以我會嘗試這樣的事:

for { 
    respA <- WS.url(url1).get 
    ids = respA.body.split(",").take(2) 
    responsesB <- Future.sequence(ids.map(id => WS.url(url2 + id).get)) 
} yield { 
    responsesB.map(respB => getMyObjects(respB.xml)) 
} 

因此,類型有:

respA: Response 
ids: Array[String] 
ids.map(id => WS.url(url2 + id).get): Array[Future[Response]] 
Future.sequence(ids.map(id => WS.url(url2 + id).get)): Future[Array[Response]] 
responsesB: Array[Response] 

而且理解的返回類型的數組的Future任何getMyObjects回報。

注意,如果序列不上Future[Array[_]]工作,儘量做到ids = respA.body.split(",").toList.take(2)

+0

真的很棒的答案,工作正常,非常感謝 – Farmor