Отказ от ответственности: приведенный ниже фрагмент кода относится к одному из текущих курсов Coursera. Будем считать, что оно размещено только в учебных целях и не должно использоваться для отправки в качестве решения домашнего задания.
Как указано в комментарии ниже, нам нужно преобразовать список фьючерсов в один фьючерс списка. Более того, результирующее Future должно потерпеть неудачу, если не удалось хотя бы одно из входных Futures.
Я встретил следующую реализацию, и я не понимаю ее полностью.
/** Given a list of futures `fs`, returns the future holding the list of values of all the futures from `fs`.
* The returned future is completed only once all of the futures in `fs` have been completed.
* The values in the list are in the same order as corresponding futures `fs`.
* If any of the futures `fs` fails, the resulting future also fails.
*/
def all[T](fs: List[Future[T]]): Future[List[T]] =
fs.foldRight(Future(Nil:List[T]))((f, fs2) =>
for {
x <- f
xs <- fs2
} yield (x::xs))
В частности, я не понимаю в нем следующие вещи:
- Где происходит
Future[T] -> T
преобразование? Похоже, чтоxs <- fs2
— это единственное место, где мы касаемся исходногоFutures
, и каждый изxs
должен бытьFuture[T]
(но почему-то он становится простоT
). - Как обрабатываются сбои? Похоже, что результирующий объект
Future
действительно терпит неудачу, когда один из входныхFutures
терпит неудачу.