我正在使用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
语句没有完成?
答案 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
,因为它已包含有关异步计算是否成功的信息。