【发布时间】:2015-02-28 02:21:14
【问题描述】:
我与 Play! Scala 2.2 合作,我需要进行递归 Web 服务调用(直到我得到所有结果)。
目前我设法使用Await.result 如下:
def getTitleSetFromJson( jsValue: JsValue ): Set[ String ] = {
val titleReads: Reads[Option[String]] = (__ \\ "title").readNullable[String]
(jsValue \ "response" \ "songs")
.asOpt[Set[Option[String]]](Reads.set(titleReads))
.getOrElse(Set.empty)
.flatten
}
def findEchonestSongs(start: Long, echonestId: String): Future[Set[String]] = {
val titleReads: Reads[Option[String]] = (__ \\ "title").readNullable[String]
val endpoint = s"$baseUrl/artist/songs"
val assembledUrl = s"$endpoint?api_key=$echonestApiKey&id=$artistId&format=json&start=$start&results=20"
WS.url(assembledUrl).get().map { songs =>
if ((songs.json \ "response" \ "total").asOpt[Int].getOrElse(0) > start + 20) {
getTitleSetFromJson(songs.json) ++
Await.result( findEchonestSongs(start + 20, echonestId), 3.seconds )
} else {
getTitleSetFromJson(songs.json)
}
}
}
现在我想做同样的事情,但使用非阻塞方式,即不使用Await.result,但我尝试的所有内容都出现错误:由于嵌套的期货,类型不匹配。
你能给我一个方法吗?
【问题讨论】:
-
我已经尝试过了,但是我得到了一个我无法解决的错误:类型不匹配;找到:scala.concurrent.Future[Set[String]] 需要:scala.collection.GenTraversableOnce[?] at findEchonestSongs(start + 20, echonestId)
标签: web-services scala recursion playframework-2.2