我希望在两项承诺成功的情况下完成一些行动.所以我创建了这样一段代码:
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()
问题是,两个日志消息都被打印出来.我希望动作只被触发一次.为什么它会被解雇两次,怎么才能让它开火一次?
您不应该为此目的使用isCompleted
方法Future
.你应该在一个未来使用flatMap
这样的结合2个期货:
for { _ <- promiseForPersistence.future _ <- promiseForReplication.future } println("Both are completed" )
onComplete
两个Promise
s完成后,可以评估回调.所以你会得到isCompleted == true
回调和2条println
消息.
有效的方法是在回调中添加回调:
promiseForPersistence.future.onSuccess { _ => promiseForReplication.future.onSuccess { _ => println(s"Acking from replication promise (persistence one already completed)" ) } }
您将获得与flatMap
(for-comprehension
)完全相同的行为,但语法更简洁.