我有一个函数,它将使用CoordinationShutdown流进行一些清理代码。
def shutdown(cs: CoordinatedShutdown, makePhase: CoordinatedShutdown.type => String, name: String)
(f: () => Funit): Unit = {
val phase = makePhase(CoordinatedShutdown)
val msg = s"$phase $name"
cs.addTask(phase, name) { () =>
logger.info(msg)
f()
}
}
当前错误是:
type mismatch;
found : scala.concurrent.Future[Unit]
required: scala.concurrent.Future[akka.Done]bloop
如何调用我的未来函数f(),然后使用Futures返回akka.Done返回类型?
我尝试过:
f()andThen(akka.Done)
但是后来我得到了错误:
found : akka.Done.type
required: PartialFunction[scala.util.Try[Unit],?]
有人可以澄清我做错了什么,应该做些什么?
您可以使用Future.map
方法将返回的Future的值转换为Future.map
:
Done
这类似于f().map(_ => Done)
,因为它在原始andThen
完成后会执行回调,但有两个重要区别:
Future
方法不会更改返回的andThen
的值,因此无法根据需要将其用于将其转换为另一种类型。Future
回调仅在原始map
成功完成时执行,否则将通过原始失败,而Future
回调应处理成功或失败结果。这些只是Scala andThen
对象上可用的几种操作中的两种。有关更完整的概述,请参见Future
上的Scala文档。 Futures and Promises上的一系列帖子中有更深入的讨论。