Блокирует ли .thenValue ()? - PullRequest
0 голосов
/ 29 мая 2020

Во многих местах я нахожу что-то вроде:

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

Является ли thenValue () блокирующим для будущего "A". Я прочитал документацию по Folly, но не смог ее понять. https://github.com/facebook/folly/blob/master/folly/docs/Futures.md

1 Ответ

1 голос
/ 29 мая 2020

Нет, не блокирует. Концептуально вы можете думать о подписи так (хотя это не настоящая подпись):

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

Основная идея c состоит в том, что если будущее, представленное std::move(A), будет успешным, переданный обратный вызов (B) будет выполнено, передав значение, созданное A future. Возвращаемое значение обратного вызова становится результатом будущего, возвращаемого thenValue().

Если вы визуальный человек (как и я), возможно, вам поможет маркировка частей подписи:

template <typename T>
template <typename TResult>
Future<TResult> Future<T>::thenValue(std::function<TResult(T&&)> callback) { ... }
^^^^^^^^^^^^^^^ ^^^^^^^^^                                        ^^^^^^^^
       3            1                                                2
  1. Будущее, в котором вы вызываете thenValue.
  2. Функция обратного вызова, которую вы передаете thenValue.
  3. Будущее, возвращаемое thenValue.

Когда (1) дает успешный результат, (2) вызывается с этим результатом. Когда (2) возвращается, (3) производит возвращаемое значение (2).

Future (3) создается синхронно, но обратный вызов (2) вызывается асинхронно.

...