Future 回调方法和 Promises [成功与失败] 的区别?

Difference between Future callback methods and Promises [Success and Failure]?

我正在 Scala Concurrency 使用 FuturePromises

我没明白,使用 Callback 方法完成 Future 和使用 Promises 之间的确切区别是什么?

是不是说Future的Callback方法实际上并没有完成Future?只有使用Promise才能完成Future?

另外,我看到很多地方,你可以从 Futures 和 Promises 中读取,但你只能写入 Promises。

你实际上并没有完成 Future,你只是在完成时将回调传递给触发器。您可以使用 Promise 来控制何时触发回调。来自 scala 官方文档的示例:

val p = Promise[T]()
val f = p.future

val producer = Future {
  val r = produceSomething()
  p success r
  continueDoingSomethingUnrelated()
}

顺便说一下 Future 在后台使用 Promises

Future 仅在异步计算结束时完成:

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")
}

而 Promises 可以产生可以手动完成的未来。

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。

你不能complete一个Future

A 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(Try(10))