什么是未来的onComplete和flatMap之间的区别?

时间:2014-10-14 09:44:40

标签: scala asynchronous future reactive-programming

我正在使用ReactiveMongo驱动程序编写Scala应用程序。访问db的方法始终为Future[T]。以下代码是否相同?

(使用onComplete

val results: Future[List[Tag]] = Tags.all.toList
results onComplete {
    case Success(list) => //do something with list
    case Failure(t) => //throw the error
}

(使用flatMap

Tags.all.toList.flatMap(list => //do something with list)

有什么区别?

flatMap不会抛出失败?而flatMap是一个回调,如onComplete或等到Tags.all.toList语句没有完成?

1 个答案:

答案 0 :(得分:35)

如有疑问,请按照类型进行操作。

onComplete返回Unit,它允许您对Future结果执行某些操作,但它不会返回值

flatMap允许您对列表执行某些操作返回新的Future

所以flatMap更强大,因为它允许你链接多个未来,在整个过程中对它们的价值做一些事情,并且只在最后处理失败案例。使用Erik Meijer的话:"它引导你走过快乐的道路"。

所以例如你可以做

val finalFuture = results
 .flatMap(x => /* do something and return a future */)
 .flatMap(y => /* do something else and return a future */)
 .flatMap(z => /* do something else and return a future */)
 .map(myresult => /* do something */)

如果在此过程中出现问题,链条会提前中断,您将收到第一个错误。

这允许更好的语法

 val finalFuture = for {
    x <- results
    y <- /* do something and return a future */
    z <- /* do something and return a future */
 } yield something(z)

如果您需要处理失败案例,现在可以使用onComplete,或者 - 甚至更好 - 只需返回Future,因为它已包含有关异步计算是否成功的信息。