在Scala / Play中以线性方式执行http请求

时间:2018-01-24 18:36:12

标签: scala scala-collections

我正在使用play的WSClient来进行REST调用。每个响应都是Future[WSResponse]类型。如果我有一个URL列表,并且我为所有这些URL进行REST调用,我将获得Future[WSResponse]的集合。我理解Future.sequenceFuture.traverse的概念。但我的要求略有不同。

我说List(url1, url2,url3)我想对url1进行REST调用,一旦Future [WSResponse]完成,我想调用url2,依此类推。 .. 我怎么做?我希望有一个lambda来为每个响应做一些事情。

1 个答案:

答案 0 :(得分:1)

这是一个非常通用的示例方法:

def mapToFutureInSequence[A, B](as: List[A], f: A => Future[B])(implicit ec: ExecutionContext): Future[List[B]] = {
  as.foldLeft(Future.successful(List.empty[B])) { (fbs, a) =>
    for {
      bs <- fbs
      b <- f(a)
    } yield b :: bs
  }.map(_.reverse)
}

在这种情况下,A将是一个网址,fWSClient的方法返回Future[WSResponse],或者某个自定义函数与如果你想涉及你提到的lambda。