Причина, по которой вы получаете только ошибку третьего будущего, состоит в том, что значение целого блока является последним выражением блока, поэтому
Future(5).map { factor =>
firstFuture(factor) // this executes but the result is discarded
secondFuture(factor) // this executes but the result is discarded
thirdFuture // the last expression becomes the value of the whole block
}
Также рассмотрите, что происходит, когда у нас есть вложенные фьючерсы и мы бросаем во внутреннее будущее
Future(41).map { v =>
Future(throw new RuntimeException("boom")) // the exception is simply swallowed
v + 1
}
Результат - Future(42)
, несмотря на исключение, выброшенное во внутреннее Future
. Это важно понимать, так как в противном случае мы можем ввести тихие сбои в системе.
Для достижения вашего требования попробуйте комбинацию для понимания и Future.sequence
for {
factor <- Future(5)
results <- Future.sequence(List(firstFuture(factor), secondFuture(factor), thirdFuture))
} yield results
Три фьючерса, переданные в sequence
, будут выполняться одновременно, а sequence
вернет неудачное будущее, если произойдет сбой любого из них.