Я пытаюсь найти самый аккуратный способ выполнить последовательность Futures в последовательности, где одно исполнение Будущего зависит от предыдущего. Я пытаюсь сделать это для произвольного количества фьючерсов.Scala - Выполнять произвольное число фьючерсов последовательно, но зависимо
случае Пользователь:
- я извлек несколько идентификаторов из моей базы данных.
- Теперь мне нужно получить некоторые связанные данные в веб-службе.
- Я хочу остановиться, как только я нашел правильный результат.
- Я забочусь только о результате, который преуспел.
Выполнение всех этих операций параллельно, а затем анализ полученных результатов не является вариантом. Я должен сделать один запрос одновременно и выполнить следующий запрос только в том случае, если предыдущий запрос не дал никаких результатов.
Текущее решение находится вдоль этих линий. Использование foldLeft для выполнения запросов, а затем только оценка следующего будущего, если предыдущее будущее соответствует некоторому условию.
def dblFuture(i: Int) = { i * 2 }
val list = List(1,2,3,4,5)
val future = list.foldLeft(Future(0)) {
(previousFuture, next) => {
for {
previousResult <- previousFuture
nextFuture <- { if (previousResult <= 4) dblFuture(next) else previousFuture }
} yield (nextFuture)
}
}
Большой недостаток этого является) я продолжаю обрабатывать все элементы, даже когда я получил результат я доволен и б) один раз я нашел результат я после, я держу оценивая предикат. В этом случае это просто, но на самом деле это может быть сложнее.
Я чувствую, что мне не хватает гораздо более элегантного решения.
Я запутался в случае использования, потому что это не похоже подобно тому, как у вас есть вид зависимости потока данных, который вы описываете («одно исполнение Будущего зависит от предыдущего»), поскольку вы выполняете только следующее Будущее, если предыдущий результат в будущем был * пустым *. Что мне не хватает? То есть, следующее будущее зависит от предыдущего результата каким-либо образом, кроме как просто решить, выполняется ли оно? –
Это очень похоже на http: // stackoverflow.com/questions/26438991/is-there-sequential-future-find/26439838 # 26439838 (см. мой ответ там) и http://stackoverflow.com/questions/26349318/how-to-invoke-a-method-again- and-again-until-it-returns-a-future-value –
@ChrisMartin Следующее исполнение фьючерса зависит не только от того, удалось ли предыдущему Будущему, но и от ответа. Например: если предыдущее будущее содержит WSResponse со статусом 404, выполните следующее будущее, иначе нет. – healsjnr