Baike.dev
All toolsOnline toolsAI codingTrendingOpen sourceNewsSubmit
Log in
< Back to tools
P

promise-cpp

> 编程语言
Open source

C++ promise/A+ library in Javascript style.

696 stars0 likes0 views
WebsiteGitHub

About

C++ promise/A+ library in Javascript style.

散了吧,cpp20 coroutine了,这么代码已经没有意义 -- 作者

C++ promise/A+ library in Javascript style.

  • What is promise-cpp ?
  • Features
  • Examples
    • Examples list
    • Compiler required
    • Usage
      • Used as header only library
      • Used as static library
      • Used as shared library
      • Build tips about asio examples
    • Sample code 1
    • Sample code 2
  • Global functions
    • Promise newPromise(FUNC func);
    • Promise resolve(const RET_ARG... &ret_arg);
    • Promise reject(const RET_ARG... &ret_arg);
    • Promise all(const PROMISE_LIST &promise_list);
    • Promise race(const PROMISE_LIST &promise_list);
    • Promise raceAndReject(const PROMISE_LIST &promise_list);
    • Promise raceAndResolve(const PROMISE_LIST &promise_list);
    • Promise doWhile(FUNC func);
  • Class Promise - type of promise object
    • Promise::then(FUNC_ON_RESOLVED on_resolved, FUNC_ON_REJECTED on_rejected)
    • Promise::then(FUNC_ON_RESOLVED on_resolved)
    • Promise::then(Defer d)
    • Promise::then(DeferLoop d)
    • Promise::then(Promise promise)
    • Promise::fail(FUNC_ON_REJECTED on_rejected)
    • Promise::finally(FUNC_ON_FINALLY on_finally)
    • Promise::always(FUNC_ON_ALWAYS on_always)
  • Class Defer - type of callback object for promise object.
    • Defer::resolve(const RET_ARG... &ret_arg);
    • Defer::reject(const RET_ARG... &ret_arg);
  • Class DeferLoop - type of callback object for doWhile.
    • DeferLoop::doContinue();
    • DeferLoop::doBreak(const RET_ARG... &ret_arg);
  • And more ...
    • About exceptions
    • About the chaining parameter
    • Match rule for chaining parameters
      • Resolved parameters
      • Rejected parameters
      • Omit parameters
    • Copy the promise object
    • Life time of the internal storage inside a promise chain
    • Handle uncaught exceptional or rejected parameters
    • about multithread

What is promise-cpp ?

Promise-cpp is library that implements promise/A+ standard, which can be the base component in event-looped asynchronized programming. It is NOT std::promise.

Features

Similar to Javascript Promise API.

Type safety: the resolved/rejected arguments can be captured by the "then" function with same arguments type.

Exceptions supports: cpp exception will be received by the "on_rejected" function.

Optional header-only configuration enabled with the PROMISE_HEADONLY macro

Easy to use, just #include "promise-cpp/promise.hpp" is enough, code based on standard c++11 syntax, no external dependencies required.

Easy to integrate with other libararies (see examples of asio, qt and mfc).

Useful extended functions on promise object: doWhile, raceAndResolve, raceAndReject

Examples

Examples list

  • example/test0.cpp: a simple test code for promise resolve/reject operations. (no dependencies)

  • example/simple_timer.cpp: simple promisified timer. (no dependencies)

  • example/simple_benchmark_test.cpp: benchmark test for simple promisified asynchronized tasks. (no dependencies)

  • example/asio_timer.cpp: promisified timer based on asio callback timer. (boost::asio required)

  • example/asio_benchmark_test.cpp: benchmark test for promisified asynchronized tasks in asio. (boost::asio required)

  • example/asio_http_client.cpp: promisified flow for asynchronized http client. (boost::asio, boost::beast required)

  • example/asio_http_server.cpp: promisified flow for asynchronized http server. (boost::asio, boost::beast required)

  • example/qt_timer: promisified timer in QT gui thread. (QT required)

  • example/mfc_timer: promisified timer in windows MFC gui thread.

Please use cmake to build from CMakeLists.txt.

Compiler required

The library has passed test on these compilers --

  • gcc 5

  • Visual studio 2015 sp3

  • clang 3.4.2

Usage

Used as header only library

To use as header only library, just define macro PROMISE_HEADONLY when compiling.

Used as static library

cmake /path/to/promise_source

Used as shared library

cmake -DPROMISE_BUILD_SHARED=ON /path/to/promise_source

Build tips about asio examples

Some of the examples use boost::asio as io service, and use boost::beast as http service. You need to boost_1_66 or higher to build these examples.

For examples, you can build with boost library --

> cmake -DBOOST_ROOT=/path/to/boost_source /path/to/promise_source

Sample code 1

Example of asio http client. (full code here)

cpp
int main(int argc, char** argv) {
    // The io_context is required for all I/O
    asio::io_context ioc;

    // Launch the asynchronous operation
    download(ioc, "http://www.163.com/")
    .then([&]() {
        return download(ioc, "http://baidu.com/");
    }).then([&]() {
        return download(ioc, "http://qq.com");
    }).then([&]() {
        return download(ioc, "http://github.com/xhawk18");
    });

    // Run the I/O service. The call will return when
    // the get operation is complete.
    ioc.run();

    return 0;
}

Sample code 2

This sample code shows converting a timer callback to promise object.

…

Global functions

Promise newPromise(FUNC func);

Creates a new promise object with a user-defined function. The user-defined functions, used as parameters by newPromise, must have a parameter Defer d. for example --

cpp
return newPromise([](Defer d){
})

Promise resolve(const RET_ARG... &ret_arg);

Returns a promise that is resolved with the given value. for example --

cpp
return resolve(3, '2');

Promise reject(const RET_ARG... &ret_arg);

Returns a promise that is rejected with the given arguments. for example --

cpp
return reject("some_error");

Promise all(const PROMISE_LIST &promise_list);

Wait until all promise objects in "promise_list" are resolved or one of which is rejected. The "promise_list" can be any container that has promise object as element type.

for (Promise &promise : promise_list) { ... }

for example --

cpp
Promise d0 = newPromise([](Defer d){ /* ... */ });
Promise d1 = newPromise([](Defer d){ /* ... */ });
std::vector promise_list = { d0, d1 };

all(promise_list).then([](){
    /* code here for all promise objects are resolved */
}).fail([](){
    /* code here for one of the promise objects is rejected */
});

Promise race(const PROMISE_LIST &promise_list);

Returns a promise that resolves or rejects as soon as one of the promises in the iterable resolves or rejects, with the value or reason from that promise. The "promise_list" can be any container that has promise object as element type.

for (Promise &promise : promise_list) { ... }

for example --

cpp
Promise d0 = newPromise([](Defer d){ /* ... */ });
Promise d1 = newPromise([](Defer d){ /* ... */ });
std::vector promise_list = { d0, d1 };

race(promise_list).then([](){
    /* code here for one of the promise objects is resolved */
}).fail([](){
    /* code here for one of the promise objects is rejected */
});

Promise raceAndReject(const PROMISE_LIST &promise_list);

Same as function race(), and reject all depending promises object in the list.

Promise raceAndResolve(const PROMISE_LIST &promise_list);

Same as function race(), and resove all depending promises object in the list.

Promise doWhile(FUNC func);

"While loop" for promisied task. A promise object will passed as parameter when call func, which can be resolved to continue with the "while loop", or be rejected to break from the "while loop".

for example --

cpp
doWhile([](DeferLoop d){
    // Add code here for your task in "while loop"
    
    // Call "d.doContinue()" to continue with the "while loop",
    
    // or call "d.doBreak()" to break from the "while loop", in this case,
    // the returned promise object will be in resolved status.
});

Class Promise - type of promise object

Promise::then(FUNC_ON_RESOLVED on_resolved, FUNC_ON_REJECTED on_rejected)

Return the chaining promise object, where on_resolved is the function to be called when previous promise object was resolved, on_rejected is the function to be called when previous promise object was rejected. for example --

cpp
return newPromise([](Defer d){
    d.resolve(9567, 'A');
}).then(

    /* function on_resolved */ [](int n, char ch){
        printf("%d %c\n", n, ch);   //will print 9567 here
    },

    /* function on_rejected */ [](){
        printf("promise rejected\n"); //will not run to here in this code 
    }
);

Promise::then(FUNC_ON_RESOLVED on_resolved)

Return the chaining promise object, where on_resolved is the function to be called when previous promise object was resolved. for example --

cpp
return newPromise([](Defer d){
    d.resolve(9567);
}).then([](int n){
    printf("%d\n", n);  b //will print 9567 here
});

Promise::then(Defer d)

Return the chaining promise object, where d is the callback function be called when previous promise object was resolved or rejected.

Promise::then(DeferLoop d)

Return the chaining promise object, where d is the callback function be called when previous promise object was resolved or rejected.

Promise::then(Promise promise)

Return the chaining promise object, where "promise" is the promise object be called when previous promise object was resolved or rejected.

Promise::fail(FUNC_ON_REJECTED on_rejected)

Return the chaining promise object, where on_rejected is the function to be called when previous promise object was rejected.

This function is usually named "catch" in most implements of Promise library. https://www.promisejs.org/api/

In promise_cpp, function name "fail" is used instead of "catch", since "catch" is a keyword of c++.

for example --

cpp
return newPromise([](Defer d){
    d.reject(-1, std::string("oh, no!"));
}).fail([](int err, string &str){
    printf("%d, %s\n", err, str.c_str());   //will print "-1, oh, no!" here
});

Promise::finally(F

Issues· 0 open

View all issuesOpen on GitHub

No open issues yet, or sync has not completed.

> Tags

C++

No comments yet. Be the first to share.

> Details

PublishedAug 1, 2026
UpdatedSep 17, 2026
Category编程语言
PricingOpen source

> Related tools

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言