【发布时间】:2019-11-06 17:20:02
【问题描述】:
假设我有以下操作必须按顺序进行:
- 获取博文
- 后分析
- 转发博文
在代码中可能如下所示:
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)
)
我很困扰,为了确保正确的执行顺序,我必须在 ignoredResponse 中传递 blogPost 以确保它可用于第 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 和Future 产生副作用,同时自动保留原始Future 的值和严格的操作顺序?
【问题讨论】:
标签: scala future scala-cats