我使用Scala Concurrency
和Future
倾斜Promises
。
我没有说明问题,使用Callback
方法完成未来与使用Promise之间的确切区别是什么?
这是否意味着Future Callback方法实际上没有完成未来?只有使用Promise我们才能完成未来?
另外,我见过许多你喜欢的地方可以阅读Futures和Promises,但你只能写信给Promises。
答案 0 :(得分:4)
期货只在异步计算结束时完成:
val f: Future[List[Int]] = Future {
makeSomeNumbers() //when this finishes, the Future is completed.
}
f onSuccess {
case foo => println("I was completed when makeSomeNumbers finished")
}
Promise可以产生可以手动完成的未来。
val p = Promise[String]()
val f = p.future
p success('hi') //when success is called, the Future is completed.
f onSuccess {
case foo => println("I was completed because a Promise told me to do so")
}
传递给onSuccess
的回调没有完成Future,它只会在Future完成并且执行某些操作时进行侦听。对于Promises,您可以调用其success
方法来完成其关联的Future。
答案 1 :(得分:3)
您不能complete
Future
。
Future
应该是一个计算,这个计算(一旦启动)就完成了。创建后您无法控制它。你可以为它分配onComplete
回调,当这个未来完成时你会被触发,但你无法控制它什么时候。
如果您想让Future
完成,您可以控制,Promise
Future
就像政治家一样。现在,无论你是成功还是失败,都取决于你。
// lets promise an Int
val promise = Promise[Int]()
// Now... we also have a future associated with this promise
val future = promise.Future
// assign a callback which will be called when future completes
future.onComplete(
case Success(i) => println("Future complete :: " + i)
case Failure(ex) => println("Future failed :: " + ex.toString)
)
// Future by itself provides you no way to complete it
// if you want to complete this future, you can fulfil your promise
promise.complete(10)
答案 2 :(得分:0)
您实际上完成 Future
,只是在完成时将回调传递给触发器。您可以使用Promise
来控制何时触发回调。来自scala官方文档的示例:
val p = Promise[T]()
val f = p.future
val producer = Future {
val r = produceSomething()
p success r
continueDoingSomethingUnrelated()
}
btw Future
在引擎盖下使用Promises
。