我在用:
> Scala 2.10
>播放2.1
目前,我正在使用来自scala.concurrent._的Future类,但是我可以尝试另一个API.
我将多个期货的结果合并成一个List [(String,String)]时遇到麻烦.
以下Controller方法成功将单个Future的结果返回给HTML模板:
def test = Action { implicit request => queryForm.bindFromrequest.fold( formWithErrors => Ok("Error!"),query => { Async { getSearchResponse(query,0).map { response => Ok(views.html.form(queryForm,getAuthors(response.body,List[(String,String)]()))) } } }) }
getSearchResult(String,Int)方法执行一个Web服务API调用并返回一个Future [play.api.libs.ws.Response].方法getAuthors(String,List [(String,String)])返回一个List [(String,String)]到HTML模板.
现在,我试图在for循环中调用getSearchResult(String,Int)来获取几个响应体.以下应该提出我想要做什么的想法,但是我收到编译时错误:
def test = Action { implicit request => queryForm.bindFromrequest.fold( formWithErrors => Ok("Error!"),query => { Async { val authors = for (i <- 0 to 100; if i % 10 == 0) yield { getSearchResponse(query,i) }.map { response => getAuthors(response.body,String)]()) } Ok(views.html.form(queryForm,authors)) } }) }
类型不匹配;发现:scala.collection.immutable.IndexedSeq [scala.concurrent.Future [List [(String,String)]]]必需:List [(String,String)]
如何将几个Future对象的响应映射到单个结果?
解决方法
创建一个由列表或其他结果类型集合参数化的未来.
从here:
在Play 1中,您可以这样做:
F.Promise<List<WS.HttpResponse>> promises = F.Promise.waitAll(remoteCall1,remoteCall2,remoteCall3); // where remoteCall1..3 are promises List<WS.HttpResponse> httpResponses = await(promises); // request gets suspended here
在Play 2不太直接:
val httpResponses = for { result1 <- remoteCall1 result2 <- remoteCall2 } yield List(result1,result2)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。