.thenValue() 阻塞了吗?

Is .thenValue() blocking?

在很多地方我发现类似的东西:

std::move(A).thenValue(B)

thenValue() 是否阻塞了未来 "A"。我通读了 Folly 文档,但无法理解。 https://github.com/facebook/folly/blob/master/folly/docs/Futures.md

不,它没有阻塞。从概念上讲,你可以这样想签名(尽管这不是实际的签名):

template <typename T>
template <typename TResult>
Future<TResult> Future<T>::thenValue(std::function<TResult(T&&)> callback) { ... }

基本思想是,如果 std::move(A) 代表的未来成功,传递的回调 (B) 将被执行,传入 A 未来产生的值。回调的 return 值成为 thenValue() 编辑的未来 return 的结果。

如果您是一个视觉人(像我一样),那么标记部分签名可能会有所帮助:

template <typename T>
template <typename TResult>
Future<TResult> Future<T>::thenValue(std::function<TResult(T&&)> callback) { ... }
^^^^^^^^^^^^^^^ ^^^^^^^^^                                        ^^^^^^^^
       3            1                                                2
  1. 您正在调用 thenValue 的未来。
  2. 你传给thenValue的回调函数。
  3. 未来 return 由 thenValue 编辑。

当 (1) 获得成功结果时,将使用该结果调用 (2)。当 (2) returns 时,(3) 产生 (2) 的 return 值。

future (3) 是同步构造的,但回调 (2) 是异步调用的。