2

我有一个我想要按顺序加载和处理(解析、存储到数据库)的 URL 列表 [String]。

我发现只有固定长度的例子,比如:

    def readUrls = Action {
    implicit request => {
        implicit val context = scala.concurrent.ExecutionContext.Implicits.global

        val url1 = "http://some-website.com"
        val url2 = "http://other-website.com"

        Async {
            for {
                result1 <- WS.url(url1).get()
                result2 <- WS.url(url2).get()
            } yield {
                Ok(result1.body + result2.body)
            }
        }
}

但我需要处理这只小狗,而不是 url1 和 url2:

val urls = List("http://some-website.com", "http://other-website.com")

非常感谢您提供的任何提示和建议!

4

2 回答 2

3

如果您想将Futures 任意顺序链接在一起,foldLeft应该这样做:

urls.foldLeft(Future.successful[String]("")){ case (left, nextUrl) =>
    left.flatMap{ aggregatedResult =>
        WS.url(nextUrl).get().map( newResult =>
            aggregatedResult + newResult.body
        )
    }
}

由于您只是将请求主体组合在一起,因此我给出了foldLeft一个Futureempty的初始值String,折叠中的每一步都将添加到下一个响应主体中。

于 2014-06-26T20:12:12.217 回答
2
def executeUrls(urls: List[String]): Future[String] = {
  urls.foldLeft(Future(""))((accumulator, url) => {
      accumulator.flatMap(acc => {
        WS.url(url).get().map(response => {
          acc + response.body
        })
      }
  })
}

这应该是您正在寻找的,请注意它返回一个新的 Future。

编辑:显然 LimbSoup 更快。

于 2014-06-26T20:14:39.407 回答