我需要对不同的URL进行一些请求,从他们的响应中获取数据,然后将此信息放在一个列表中,但是我对此主题有些误解。1)我只要求一个
def doRequest: Future[WSResponse] = {
client
.url("MY_URL")
.withRequestTimeout(5000)
.get()}
然后我解析json以响应我的对象列表:
def list: Future[List[FoobarEntry]] = {
doRequest.map {
response => {
val json = response.json \ "foobar"
json.validate[List[FoobarEntry]] match {
case js:JsSuccess[List[FoobarEntry]]=>
js.get
case e:JsError => Logger.error(JsError.toFlatJson(e).toString()); List()
}
}
}}
我认为对于几个网址,我应该写一些像
def doRequests: List[Future[WSResponse]] = {
List(client
.url("URL_1")
.withRequestTimeout(5000)
.get(),
client
.url("URL_2")
.withRequestTimeout(5000)
.get())}
但是如何像我一样解析这个Future [WSResponse]列表def list: Future[List[FoobarEntry]]
呢?
由于您将将来的响应放入列表中,因此您将必须使用解析逻辑将每个将来的响应映射为FoobarEntry
。像这样:
val responseFutures: List[Future[WSResponse]] = ???
val foobarFutures: List[Future[FoobarEntry]] =
responseFutures.map(future => future.map(response => parse(response)))
现在,您有了将来解析的响应的列表,但是要在所有响应到达后执行某些操作,则需要对该列表进行排序:
val futureFoobars = Future.sequence(foobarFutures)
因此,序列帮助您从获得C[Future[A]]
到Future[C[A]]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句