加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala,play,futures:结合多个期货的结果

发布时间:2020-12-16 19:07:02 所属栏目:安全 来源:网络整理
导读:我在用: Scala 2.10 播放2.1 目前,我正在使用来自scala.concurrent._的Future类,但是我可以尝试另一个API. 我将多个期货的结果合并成一个List [(String,String)]时遇到麻烦. 以下Controller方法成功将单个Future的结果返回给HTML模板: def test = Action {
我在用:

> 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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读