0

在 play-scala 应用程序中,我进行了 WS 调用:

def getaddresses : ListBuffer[String] = {
   var lb = new ListBuffer[String]()
   var url = "xyz@xyx.com/someapi"

   WS.url(url).get.map {
      response =>
        var emailsSeq = (response.json \\ "email")
        emailsSeq.foreach(lb+=_.toString())
        lb.foreach(println)     //This is filled with values
  }
  lb.foreach(println)           //This is empty
  lb
}

在 map 内部,返回一个序列,我将其条目放入 ListBuffer lb 中以由该方法返回。问题是 ListBuffer 在 map{} 内显示值,但不在其外显示。结果,从该方法传递了空的 ListBuffer。

我认为 ws 响应可能会有延迟,所以尝试了以下没有优势的方法:

WS.url(url).withRequestTimeout(10.seconds).get.map {

请帮助我获得要返回的填充列表缓冲区

4

1 回答 1

0

我认为 ws.url(url).get 方法是异步的,所以当你调用 lb.foreach(println) 时,没有什么可以打印的。尝试在 map 代码块之后添加 Thread.sleep。如果是这样,您应该使 getaddresses 方法异步,或使用 future/promise。

PS:你应该使用 val 而不是 var,只是为了更简洁的代码。

编辑:示例尝试:

def getaddresses : ListBuffer[String] = {
   val url = "xyz@xyx.com/someapi"

   val promiseOfAddresses = Promise[ListBuffer[String]]()
   WS.url(url).get.map {
      response =>
        var emailsSeq = (response.json \\ "email")
        promiseOfAddresses.success(emailsSeq) // here you will complete promise with actual value
  }
  val lb = promiseOfAddresses.future.get // here you will obtain future from promise and also get value of future. Method get is blocking and it will wait till promise is fullfiled or failed
  lb.foreach(println)           //This is empty
  lb
}

PS2:可能对未来/承诺的最佳帮助可以在这里找到:the-neophytes-guide-to-scala-part-9-promises-and-futures-in-practice(我没有足够的声誉,所以谷歌这个博客)它类似于Java 世界中的CompletableFuture。但请记住,最好的方法是始终保持红色(红色 = 异步函数/方法。看起来不错,但很健谈,博客what-c​​olor-is-your-function

于 2016-07-13T08:41:15.837 回答