Ответ 1
scala.concurrent.Future
разработан как компромисс двух асинхронных подходов:
- Объектно-ориентированный observer, который позволяет связывать асинхронные обработчики
- Функциональный monad, который предлагает богатые функциональные возможности компоновки.
Чтение Future.andThen
docs:
Применяет побочную функцию к результату этого будущего и возвращает новое будущее в результате этого будущего.
Итак, andThen
, скорее всего, из вселенной ООП. Чтобы получить аналогичный результат с Function1.andThen
, вы можете использовать метод map
:
Future(1).map {_ * 2}.map {_ * 2}
andThen
отличается от onComplete
одной маленькой вещью: в результате Future of andThen
все равно возвращает тот же результат, но будет ждать, пока предоставленный наблюдатель не вернет или не выбросит что-то. Вот почему в документах написано:
Этот метод позволяет обеспечить, чтобы обратные вызовы выполнялись в указанный порядок.
Также обратите внимание на третью строку из документов:
Обратите внимание, что если один из прикованных callback-вызовов andThen выдает исключение, это исключение не распространяется на последующие обратные вызовы andThen. Вместо этого последующие обратные вызовы andThen получают исходное значение этого будущего.
Поэтому он ничего не делает с новым результатом Future
. Не мог даже испортить его собственным исключением. Это andThen
и onComplete
просто последовательное и параллельное связывание наблюдателей.