Promisify functions
Explains how to promisify callback taking functions into a continuable_
Contents
Promisification and continuables
The promisification has a longer history in the JavaScript world where the legacy way of asynchronous programming was the usage of callbacks of the form function(error, result...). The ideal way of dealing with such an asynchronous result is to return a promise and soon utility helpers were provided to do so.
The usage of callbacks to represent an asynchronous result is still a popular way nowadays. Thus the library provides the promisify helper class which makes it possible to convert callback taking functions of various styles into one that returns a continuable_
Promisify boost::asio
The default callback style is something like function(error, result...) as described above. Continuable offers the promisify::
See an example of how to promisify boost asio's async_resolve below:
auto async_resolve(std::string host, std::string service) { return cti::promisify<asio::ip::udp::resolver::iterator>::from( [&](auto&&... args) { resolver_.async_resolve(std::forward<decltype(args)>(args)...); }, std::move(host), std::move(service)); }
Then it should be possible to use asio::async_resolve like this:
async_resolve("127.0.0.1", "daytime") .then([](udp::resolver::iterator iterator) { // ... });
asio and boost::asio async completion tokens
Since version 4.0.0 continuable also supports asio async initiation tokens.
- Boost 1.70 or asio 1.13.0 is required for the async initiation
- Until boost 1.72 or asio 1.16.0 overhead through an additional type erasure is added. It is recommended to update to those versions.
The special static variable cti::
#include <continuable/continuable.hpp> #include <continuable/external/asio.hpp> #include <asio.hpp> // ... asio::tcp::resolver resolver(...); resolver.async_resolve("127.0.0.1", "daytime", cti::use_continuable) .then([](asio::udp::resolver::iterator iterator) { // ... });