Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Playframework 如何跟踪数量未知的异步web服务请求_Playframework - Fatal编程技术网

Playframework 如何跟踪数量未知的异步web服务请求

Playframework 如何跟踪数量未知的异步web服务请求,playframework,Playframework,我想实现以下场景: 我关注一个用户列表,每个人都关注一个其他用户列表,比如Twitter。我想做以下工作: 给定一个特定用户,获取该用户跟随的所有人 从x个人的列表中,并行地发出x个请求,以获得他们关注的人的列表 在游戏中,我想通过WS-API来实现这一点,我猜当我并行发出x个请求时,我将有x个未来的对象来表示每个调用的结果。我的问题是,我如何确定所有的未来何时完成?我可以接受一些失败的请求,只要大多数请求成功返回。一旦它们全部返回,我想对所有响应的集合进行一些计算 鉴于我事先不知道会有多少个x

我想实现以下场景:

我关注一个用户列表,每个人都关注一个其他用户列表,比如Twitter。我想做以下工作:

给定一个特定用户,获取该用户跟随的所有人 从x个人的列表中,并行地发出x个请求,以获得他们关注的人的列表 在游戏中,我想通过WS-API来实现这一点,我猜当我并行发出x个请求时,我将有x个未来的对象来表示每个调用的结果。我的问题是,我如何确定所有的未来何时完成?我可以接受一些失败的请求,只要大多数请求成功返回。一旦它们全部返回,我想对所有响应的集合进行一些计算


鉴于我事先不知道会有多少个x,我如何确定所有的未来何时完成?

您可以使用flatMap编写未来,下面的示例使用URL数组发送多个请求连接所有结果体:

def compser = Action.async {
        val urls = List("http://jmaghreb.io","http://google.com","http://yahoo.fr","http://moroccojug.org")
        val futures:List[Future[WSResponse]] = urls.map(u=> WS.url(u).get())

        var f = futures.foldLeft[Future[String]](Future[String]{""})((e,c)=>{
          e.flatMap(oldRes => c.map(x=>oldRes+" ==> "+x.body))
        })

        f.map(s => Ok(s)).recover({case f=> Ok(s"Failure $f")})
      }
通过这种方式,您可以连接所有未来结果

如果要忽略失败的请求,只需在flatMap中添加recover,如下所示:

var f = futures.foldLeft[Future[String]](Future[String]{""})((e,c)=>{
  e.flatMap(oldRes => {
    c.map(x=>oldRes+" ==> "+x.body).recover({case f=> oldRes })
  })
})