2

我想用第一个 Web 服务的结果调用第二个 Web 服务。
下面是一些突出我意图的代码。
顺便说一句,它在 IntelliJ 中编译得很好(可能是 IDE 中的一个错误)。

  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 = 是我在 yield 方法中解析的 XML 响应

编译错误Play Framework给了我:

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

我发现编译错误很奇怪。

  1. 怎么可能Future存在[Seq[MyObject]]于那条线上?
  2. 它应该与编译的两行代码没有什么不同吗?
4

1 回答 1

4

WS.url(url1).get返回,因此forFuture[Response]理解中的所有生成器都应该是期货。在您的代码片段中,您正在混合和. 有关理解的一些背景信息,请参阅Scala For Comprehension 上的类型不匹配Array[String]Future[Response]

所以我会尝试这样的事情:

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]

for理解的返回类型是返回Future的数组getMyObjects

请注意,如果序列不起作用,Future[Array[_]]请尝试执行ids = respA.body.split(",").toList.take(2).

于 2013-07-07T05:10:08.257 回答