scala.concurrent.Promise
我试图找出scaladoc中completeWith
和tryCompleteWith
之间的区别,但没有太多解释也没有示例。
我也害怕用我目前的专业水平阅读源代码可能会误导我。需要你的建议人员举一些例子。
答案 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
, 这意味着当它失败时(因为良性竞争条件) 完成)它不会抛出异常。