folly官方例子

Future<vector<LeafResponse>> fanout(const map<Leaf, LeafReq> &leafToReqMap,
chrono::milliseconds timeout) {
vector<Future<LeafResponse>> leafFutures;
for (const auto &kv : leafToReqMap) {
const auto &leaf = kv.first;
const auto &leafReq = kv.second;
leafFutures.push_back(
getClient(leaf)
->futureLeafRPC(leafReq)
.onTimeout(timeout, [=] { return LeafResponse(); })
.onError([=](const exception &e) { return LeafResponse(); }));
}
return collect(leafFutures);
}
map<Leaf, LeafReq> buildLeafToReqMap(const Request &request,
const vector<LeafResponse> &responses);
Response assembleResponse(const Request &request,
const vector<LeafResponse> &firstFanoutResponses,
const vector<LeafResponse> &secondFanoutResponses);
Future<Response> twoStageFanout(shared_ptr<Request> request) {
return fanout(buildLeafToReqMap(*request, {}), FIRST_FANOUT_TIMEOUT_MS)
.then([=](vector<LeafResponse> &responses) {
auto firstFanoutResponses =
std::make_shared<vector<LeafResponse>>(std::move(responses));
return fanout(buildLeafToReqMap(*request, *firstFanoutResponses),
SECOND_FANOUT_TIMEOUT_MS)
.then([=](const vector<LeafResponse> &secondFanoutResponses) {
return assembleResponse(*request, *firstFanoutResponses,
secondFanoutResponses);
});
});
}