gpt4 book ai didi

scala - 当两个 promise 完成时触发 Action

转载 作者:行者123 更新时间:2023-12-02 04:40:39 27 4
gpt4 key购买 nike

我希望在两个 promise 都成功时完成一些操作。所以我创建了这样一段代码:

val promiseForPersistence = Promise[Unit]()
val promiseForReplication = Promise[Unit]()

promiseForPersistence.future.onComplete {
case scala.util.Success(_) => {
if (promiseForReplication.isCompleted) {
println(s"Acking from persistence promise (replication one already completed)" )
}
}
case _ =>
}

promiseForReplication.future.onComplete {
case scala.util.Success(_) => {
if (promiseForPersistence.isCompleted) {
println(s"Acking from replication promise (persistence one already completed)" )
}
}
case _ =>
}

promiseForPersistence.success()
promiseForReplication.success()

问题是,两条日志消息都被打印出来了。我希望 Action 只被解雇一次。为什么它会被触发两次,我怎样才能让它只触发一次?

最佳答案

您不应为此目的在 Future 上使用 isCompleted 方法。您应该像这样使用 flatMap 将 2 个 futures 组合成一个 futures:

for {
_ <- promiseForPersistence.future
_ <- promiseForReplication.future
} println("Both are completed" )

onComplete 中的回调可以在两个 Promise 完成后进行评估。所以你会在回调和 2 个 println 消息中得到 isCompleted == true

有效的方法是在回调中添加回调:

promiseForPersistence.future.onSuccess { _ =>
promiseForReplication.future.onSuccess { _ =>
println(s"Acking from replication promise (persistence one already completed)" )
}
}

使用 flatMap(for-comprehension),您将获得完全相同的行为,但语法不那么冗长。

关于scala - 当两个 promise 完成时触发 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20872235/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com