| Home | Libraries | People | FAQ | More

### Return Errorcode or Data

Things get a bit more interesting when the async operation’s callback passes multiple data items of interest. One approach would be to use `std::pair<>` to capture both:

    std::pair< AsyncAPI::errorcode, std::string > read_ec( AsyncAPI & api) {
        typedef std::pair< AsyncAPI::errorcode, std::string > result_pair;
        boost::fibers::promise< result_pair > promise;
        boost::fibers::future< result_pair > future( promise.get_future() );
        // We promise that both 'promise' and 'future' will survive until our
        // lambda has been called.
    #if ! defined(BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES)
        api.init_read([promise=std::move( promise)]( AsyncAPI::errorcode ec, std::string const& data) mutable {
                                promise.set_value( result_pair( ec, data) );
                      });
    #else // defined(BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES)
        api.init_read(
                std::bind([]( boost::fibers::promise< result_pair > & promise,
                              AsyncAPI::errorcode ec, std::string const& data) mutable {
                                promise.set_value( result_pair( ec, data) );
                      },
                      std::move( promise),
                      std::placeholders::_1,
                      std::placeholders::_2) );
    #endif // BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
        return future.get();
    }

Once you bundle the interesting data in `std::pair<>`, the code is effectively identical to `write_ec()`. You can call it like this:

    std::tie( ec, data) = read_ec( api);