在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 {
请帮我填写要填写的填充列表缓冲区
答案 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)