У чому різниця між функціями Scala Future onComplete і andThen?
Обидва "а потім" і "onComplete" дозволяють спостерігати за результатом деякого майбутнього за допомогою функції зворотного зв'язку. Однак, "а потім" може бути ланцюгом, і на відміну від "onComplete", він гарантує порядок, в якому будуть застосовуватися функції зворотного зв'язку. Крім того, зворотний зв'язок, наданий на "а потім" може бути частковою функцією, яка обробляє тільки піднабір результатів (наприклад, тільки "Успіх" або тільки "Невдача").

Розглянемо наступний приклад, використовуючи «а потім» і «карту»:

«»
деф demoAndThen(fut: Future[Int]): Future[Int] = {
Наступна статтяУспішність (цінність) = успіх (цінність)
.andThen { case Успіх(цінність) => println(s"andThen2: $цінність") }
. мапа { i =>
println(s"мапа: $i")
І


«»

Коли «fut» завершується успішно, «andthen1:...», «andThen2:..." і «map:..." будуть надруковані в такому порядку.

Розглянемо аналогічний приклад з використанням «onComplete» і «map»:

«»
def demoOnComplete(fut: Future[Int]): Future[Int] = {
Налаштування {t: Try[Int] => println(s"onComplete1: $t") }
Налаштування {t: Try[Int] => println(s"onComplete2: $t") }
Фундаментна карта { i =>
println(s"мапа: $i")
І


«»

У цьому випадку, коли "fut" завершується успішно, "onComplete1:...", "onComplete2:..." і "map:..." будуть надруковані в певному невизначеному порядку.

Хоча «а потім» є ланцюжком, функція зворотного виклику, як правило, не впливає на результат отриманого «Майбутнє». Але майте на увазі: якщо зворотний дзвінок кидає деякі фатальні помилки, результативне майбутнє ніколи не буде завершеним.