需要在播放ws api电话的地图外面的列表

时间:2016-07-13 08:22:18

标签: scala playframework ws-client

在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
}

在内部映射中,返回一个序列,其条目放在ListBuffer lb中,由此方法返回。 问题是ListBuffer在map {}中显示值,但不显示在它之外。结果,从方法传递空的ListBuffer。

我认为ws响应可能有延迟,所以尝试以下没有任何优势:

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

请帮我填写要填写的填充列表缓冲区

1 个答案:

答案 0 :(得分:0)

我认为ws.url(url).get方法是异步的,所以当你调用lb.foreach(println)时,没有什么可以打印的。尝试在映射代码块之后添加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:可能在这里可以找到对未来/承诺的最佳帮助:新手 - 指南 - scala-part-9-promises-and-futures-in-practice(我没有足够的声誉,所以谷歌这个博客)它类似于java世界中的CompletableFuture。但请记住,最好的方法是将所有时间留在红色方面(红色=异步函数/方法。看得很好,但很健谈,博客what-color-is-your-function