Skip to content

Reduction does not appear to work for failed futures #113

@Frans-Willem

Description

@Frans-Willem

The following code works, and prints both "Recover on test called" and "Recover on package called"

  // Make a ready resolved future
  auto test = stlab::make_ready_future(stlab::immediate_executor);
  // Create a future that we'll resolve later.
  auto package = stlab::package<void()>(stlab::immediate_executor, []() {});
  // Chain this to-be-resolved future after test.
  test.then([package]() { return package.second; })
      // Chain something to catch resolves/rejections
      .recover([](stlab::future<void> f) {
        std::cout << "Recover on test called" << std::endl;
      })
      .detach();
  // Also stay informed of the package:
  package.second.recover([](stlab::future<void> f) {
    std::cout << "Recover on package called" << std::endl;
  }).detach();
  // Now resolve the chained future.
  package.first();

However, if we have the inner package fail, it will only print "Recover on package called":

  // Make a ready resolved future
  auto test = stlab::make_ready_future(stlab::immediate_executor);
  // Create a future that we'll resolve later.
  auto package = stlab::package<void()>(stlab::immediate_executor, []() {throw std::runtime_error("Oops");});
  // Chain this to-be-resolved future after test.
  test.then([package]() { return package.second; })
      // Chain something to catch resolves/rejections
      .recover([](stlab::future<void> f) {
        std::cout << "Recover on test called" << std::endl;
      })
      .detach();
  // Also stay informed of the package:
  package.second.recover([](stlab::future<void> f) {
    std::cout << "Recover on package called" << std::endl;
  }).detach();
  // Now resolve the chained future.
  package.first();

I'm running a clone from the master branch that is up to date as of today...

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions