Promise.completeWith与Promise.tryCompleteWith有何不同?

时间:2017-05-18 14:00:58

标签: scala

scala.concurrent.Promise

我试图找出scaladoc中completeWithtryCompleteWith之间的区别,但没有太多解释也没有示例。 我也害怕用我目前的专业水平阅读源代码可能会误导我。需要你的建议人员举一些例子。

1 个答案:

答案 0 :(得分:3)

Promise.completeWith只是一个调用Promise.tryCompleteWith

的包装器
/** Completes this promise with the specified future, once that future is completed.
 *
 *  @return   This promise
 */
final def completeWith(other: Future[T]): this.type = tryCompleteWith(other)

/** Attempts to complete this promise with the specified future, once that future is completed.
 *
 *  @return   This promise
 */
final def tryCompleteWith(other: Future[T]): this.type = {
    other onComplete { this tryComplete _ }
    this
}

说实话,我不知道他们为什么做出这个决定,因为它看起来像一个简单的包装,仅此而已。

修改

正如@Alexey Romanov指出的那样,this GitHub issue points out the reason for this弃用:

  

completeWith已完成时调用DefaultPromise,   导致回调未正确执行。

     

这是因为Future.InternalCallbackExecutor延伸   BatchingExecutor假设unbatchedExecute为异步,   在这种情况下,它是同步,如果抛出异常   通过执行批处理,它会创建一个剩余的新批处理   当前批次中的项目并将其提交到unbatchedExecute   然后重新抛出,但如果你有同步unbatchedExecute,它会   失败,因为它不是可重入的,正如失败的require所见证的那样   正如本期报道的那样。

     

此提交通过将completeWith委托给tryComplete来避免问题,   具有使用onComplete + tryComplete i.s.o的效果。 complete,   这意味着当它失败时(因为良性竞争条件)   完成)它不会抛出异常。