【发布时间】:2015-08-06 18:15:32
【问题描述】:
我正在访问一个返回分页 JSON 响应的 HTTP 端点。 'meta.next' 的值 在我的响应类型中指向响应的下一页。当此值为空时,没有更多页面 检索。 我正在使用 Spray IO 发出 HTTP 请求。我收集每个感兴趣的条目 页面响应并将其与迄今为止收集的内容连接起来。当下一个变成 null,我返回所有收集的条目。 我的问题:有没有办法让'getJson(...)'函数低于尾递归?
case class JsonResponse(meta: Meta, items: List[Item])
val pipeline: Future[HttpRequest => Future[JsonResponse]] = for (
Http.HostConnectorInfo(connector, _) <-
IO(Http) ? Http.HostConnectorSetup("somehost.com", port = 80)
) yield sendReceive(connector) ~> unmarshal[JsonResponse]
// .....
def getJson(relativeUrl: String)(implicit m: Monoid[Future[List[JsObject]]]) : Future[List[JsObject]] = {
val jsr = pipeline.flatMap(_(Get(relativeUrl)))
// Grab only those entries that we are interested in
val objList = jsr.map(js => js.items.collect{ case o if(o.whatever.isDefined) => o.toJson.asJsObject })
jsr.flatMap(js => js.meta.next.map(next => m.append(getJson(next), objList)).getOrElse(objList))
}
【问题讨论】:
标签: scala future spray tail-recursion