У меня есть сценарий, в котором я получаю сообщение List of String, и мне нужно выполнить итерацию по String и вызвать другой метод, который является долговременным процессом. Затем я должен собрать результаты этого долгого процесса и объединить результаты и отправить их обратно в пользовательский интерфейс. Я довольно новичок в этих концепциях Future в Scala. Я использую Play framework, где-в списке Strings будет создан пользовательский интерфейс. Вот как моя первая попытка реализации сценария ХТ выглядит:Akka Future - Необходимые предложения
def futuresTest(strList: List[String]) = Action {
Async {
val ftrList: List[Future[String]] =
strList.map(s => Akka.future {longRunningCall(s)}).toList
val futureResultList = Future.sequence(ftrList)
val jsonResponse: String =
futureResultList.map(_.sum).asInstanceOf[String]
Akka.future { Ok(jsonResponse) }
}
}
Для простоты longRunningCall просто возвращает строку. Позже я привяжу его к первоначальной реализации.
def longRunningCall(s: String) = "test"
Мой вопрос в том, что в заявлении:
val ftrList: List[Future[String]] =
strList.map(s => Akka.future {longRunningCall(s)}).toList
Я бы предположил, что ftrList будет заполняться асинхронно, и когда он попадает в следующую строку, я гарантировал, что futureResultList будет содержать все элементы (т.е. strList и размер futureResultList будут равны?
val futureResultList = Future.sequence(ftrList)
Пожалуйста консультация!
При вызове '.map' на' list', он возвращает 'list' ... Вам не нужно называть' .toList' на результат. –
Я также очень удивлен, увидев, что '.sum' работает над' List [String] 'и' Future', приложенным непосредственно к 'String', по-видимому, без проблем. –
Это была ошибка. Сумма была ошибкой от меня. Однако IntelliJ ничего не жаловался! – sparkr