Я переношу код из синхронного в асинхронный. Проблема довольно проста: вызовите ряд функций и остановитесь с первым, чтобы вернуть результат без ошибок (возвращая это значение, в противном случае - последнее вычисленное значение). Я начал с:Еще одна scala Futures composition puzzler
def find(fs: Seq[Function0[Int]], result: Int = -1): Int = {
if (fs.isEmpty) result
else {
val res = fs.head()
if (res != 0) res
else find(fs.tail, res)
}
}
Однако, если функции становятся асинхронной (т.е. вернуть будущее [Int]) Я не могу получить правильный вызов. Например,
def ffind(ffs: Seq[Function0[Future[Int]]], result: Future[Int] = Future { -1 }): Future[Int] = {
if (ffs.isEmpty) result
else ffind(ffs.tail, ffs.head())
}
отлично работает, но оценивает все функции независимо от возвращаемого значения. Но что-то вроде:
def findBad(ffs: Seq[Function0[Future[Int]]], result: Future[Int] = Future { -1 }): Future[Int] = {
if (ffs.isEmpty) result
else {
ffs.head() map { res =>
if (res != 0) res
else findBad(ffs.tail, Future(res))
}
}
}
не входит. Какие-либо предложения? Мы можем предположить, что каждый вызов функции дорог, поэтому никто не должен вызываться дважды, ни после первого «успешного» вызова в последовательности. TIA
привет, это разрешено? – slouc
да, извините, мне не удалось обновить вопрос, просто подтвердив ответ. Очень признателен! –
Я просто убираю, потому что я обсессивно-компульсивный, поэтому мне интересно, разрешил ли мой ответ вашу проблему, и в этом случае вы должны отметить ее как принятую, или ее было недостаточно, и в этом случае я ее удалю. – slouc