在 Scala Future 完成后进行清理的最佳实践

use*_*167 4 scala future resource-cleanup

我想在完成后进行一些清理(如关闭数据库连接)Future
目前我是这样实现的:

Future { ... } onComplete {
  case Success(v) =>
    // ...
    conn.close()
  case Failure(ex) =>
    // ...
    conn.close()
}
Run Code Online (Sandbox Code Playgroud)

有重复的代码,也很乏味。
对此有什么最佳实践吗?

Mar*_*lic 6

由于conn.close()对成功和失败都执行相同的操作,因此可以考虑使用andThen像这样执行它作为副作用

Future { ... } andThen { _ => conn.close() }
Run Code Online (Sandbox Code Playgroud)

同样,使用onComplete我们可以做

Future { ... } onComplete { _ => conn.close() }
Run Code Online (Sandbox Code Playgroud)

之间的区别andThen,并onComplete是后者将返回Unit,那就是放弃的返回值Future