未来回调方法与Promises [成功与失败]之间的区别?

时间:2016-09-01 03:00:47

标签: scala promise future

我使用Scala ConcurrencyFuture倾斜Promises

我没有说明问题,使用Callback方法完成未来与使用Promise之间的确切区别是什么?

这是否意味着Future Callback方法实际上没有完成未来?只有使用Promise我们才能完成未来?

另外,我见过许多你喜欢的地方可以阅读Futures和Promises,但你只能写信给Promises。

3 个答案:

答案 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