Я надеялся, что код вроде следующего будет ждать обоих фьючерсов, но это не так.Скала ждет последовательность фьючерсов
object Fiddle {
val f1 = Future {
throw new Throwable("baaa") // emulating a future that bumped into an exception
}
val f2 = Future {
Thread.sleep(3000L) // emulating a future that takes a bit longer to complete
2
}
val lf = List(f1, f2) // in the general case, this would be a dynamically sized list
val seq = Future.sequence(lf)
seq.onComplete {
_ => lf.foreach(f => println(f.isCompleted))
}
}
val a = FuturesSequence
Я предположил, seq.onComplete
будет ждать их всех, чтобы завершить до завершения себя, но не так; это приводит:
true
false
.sequence
было немного трудно следовать в источнике scala.concurrent.Future, интересно, как я бы реализовать параллельно, что ждет всех первоначальных фьючерсов а (динамически размера) последовательности, или что может быть проблемой здесь.
Edit: Смежный вопрос: https://worldbuilding.stackexchange.com/questions/12348/how-do-you-prove-youre-from-the-future :)
Большое спасибо, я, вероятно, буду использовать и адаптировать эту функцию! Не могли бы вы найти точное сообщение о том, что использование 'Try' по существу отображает результат результата результата' возвращаемого значения ' исключение управления потоком' в 'Успех | Ошибка возврата? – matanster
Кстати, я мог бы очень точно реализовать одно и то же преобразование, используя обещания, а не 'Try'. Я уже склоняюсь к обещаниям, когда мне нужно расширить свойство будущего (сутенерство с неявными классами). – matanster
Вам почти наверняка не нужны обещания здесь. «Попробуй» - это, по сути, синхронное «Будущее», где вместо трех состояний (неудовлетворенности, успеха, неудачи) у вас есть только два, что точно соответствует этой проблеме. –