現在、C++でRESTサーバを作成するのに以下のPistacheというOSSを利用しています。
https://github.com/oktal/pistache

リクエストを受け付けると、画像をBase64に変換してJSONで応答したいと考え、以下を実装しました。
期待するレスポンスは以下の通りです。
itr->firstで キーを設定します。
{
"camera_1": base64でエンコードされた値,
"camera_2": base64でエンコードされた値
}

しかし、itr->first は空になっており期待する結果となりません。これは、非同期のコールバックの処理が行われる頃にはitrは既に最後まで走査が終わってしまい、対応したitrの値を取得することが出来ないのだろうと想像していますが、具体的にどのように解決すればよいのか分かりません。教えて頂けないでしょうか?

void ApiImpl::get_camera_image(Pistache::Http::ResponseWriter &response)
{
    std::map<std::string, std::string> request_url{
        {"camera_1", "http://via.placeholder.com/600"},
        {"camera_2", "http://via.placeholder.com/300"}};

    std::vector<Async::Promise<Http::Response>> responses;

    std::string responce_body = "";
    nlohmann::json json_response;
    std::string base64;

    /* 全てのキーと値の走査 */
    for (auto itr = request_url.begin(); itr != request_url.end(); itr++)
    {
        auto resp = client->get(itr->second).send();
        resp.then(
            [&](Http::Response result) {
                responce_body = result.body();
                std::cout  << itr->first << std::endl;  /* 非同期処理のコールバック中で itr->first が空になっている */
                base64 = Base64::Encode(result.body());
                json_response[key] = base64;
            },
            [](exception_ptr &ptr) { std::cout << "An exception occured during user retrieval:" << std::endl; });

        /* 非同期のリクエストをPromiseの配列に追加 */
        responses.push_back(std::move(resp));
    }

    /* awaitに非同期のリクエストを登録する */
    auto sync = Async::whenAll(responses.begin(), responses.end());

    /* 以下はサンプルコードを参考にしたため完全に理解できていませんが、全部のPromiseの応答であるFutureを最大5秒待つと想定  */
    Async::Barrier<std::vector<Http::Response>> barrier(sync);
    barrier.wait_for(std::chrono::seconds(5));

    auto json_base64 = json_response.dump();
    response.headers().add<Pistache::Http::Header::ContentType>(MIME(Application, Json));
    response.send(Pistache::Http::Code::Ok, json_base64);
}