Допустим, у меня есть следующие операции, которые должны выполняться в порядке :
- Получить запись в блоге
- Опубликовать аналитику
- Переслать запись в блоге
В коде это может выглядеть так:
val blogPostFut: Future[BlogPost] = blogService.getPost(postId)
val afterAnalytics: Future[BlogPost] = blogPostFut.flatMap(blogPost =>
val ignoredResponse: Future[Analytics] = analyticsService.sendAnalytics(blogPost)
ignoredResponse.map(_ => blogPost) // <-- THIS BOTHERS ME
)
val finalValue: Future[ForwardResult] = afterAnalytics.flatMap(blogPost =>
forwardService.forward(blogPost)
)
Меня беспокоит, что для обеспечения правильного порядка выполнения я должен передать вперед blogPost
в пределах ignoredResponse
, чтобы убедиться, что он доступен для шага 3.
Мне бы очень хотелось, чтобы я мог сделать что-то вроде этого:
blogPostFut.magicalFlatMap(analyticsService.sendAnalytics)
Где magicalFlatMap
может быть реализовано так:
// pseudocode
def magicalFlatMap[A,B](f: A => Future[B]): Future[A] = f().map(_ => this.value)
Существует ли magicalFlatMap
в стандартной программе Scala или в Cats?Возможно ли map
a Future
для побочных эффектов при автоматическом сохранении значения оригинала Future
и строгом порядке операций?