Нужен список за пределами карты в игре WS API вызова
В приложении 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 показывает значения внутри карты {}, но не показывает вне ее. В результате пустой метод ListBuffer передается из метода.
Я думал, что может быть задержка ответа ws, поэтому попробовал следующее, которое не имело никакого преимущества:
WS.url(url).withRequestTimeout(10.seconds).get.map {
Пожалуйста, помогите мне получить заполненный буфер списка для возврата
1 ответ
Я думаю, что метод ws.url(url).get является асинхронным, поэтому при вызове lb.foreach(println) печатать нечего. Попробуйте добавить Thread.sleep сразу после блока кода кода. Если это так, вы должны сделать метод getaddresses async или использовать future/ обещание.
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-обещания-и-фьючерсы-на-практике (у меня недостаточно репутации, поэтому загляните в этот блог) это что-то вроде CompletableFuture в мире Java. Но помните, что лучший способ - это все время оставаться в красной части (красный = асинхронные функции / методы. См. Хороший, но разговорчивый, блог что-цвет-это-ваша функция)