diff --git a/Tests/LibCore/TestLibCorePromise.cpp b/Tests/LibCore/TestLibCorePromise.cpp index 58dc797ad1c..286e6c50414 100644 --- a/Tests/LibCore/TestLibCorePromise.cpp +++ b/Tests/LibCore/TestLibCorePromise.cpp @@ -61,6 +61,26 @@ TEST_CASE(promise_chain_handlers) EXPECT(!rejected); } +TEST_CASE(infallible_promise_chain_handlers) +{ + Core::EventLoop loop; + + bool resolved = false; + bool rejected = false; + + NonnullRefPtr> promise = MUST(Core::Promise::try_create()) + ->when_resolved([&](int&) { resolved = true; }) + .when_rejected([&](AK::Error const&) { rejected = true; }); + + loop.deferred_invoke([=] { + promise->resolve(42); + }); + + (void)promise->await(); + EXPECT(resolved); + EXPECT(!rejected); +} + TEST_CASE(promise_map) { Core::EventLoop loop; diff --git a/Userland/Libraries/LibCore/Promise.h b/Userland/Libraries/LibCore/Promise.h index 6786cdee218..8db457e2d9b 100644 --- a/Userland/Libraries/LibCore/Promise.h +++ b/Userland/Libraries/LibCore/Promise.h @@ -82,13 +82,10 @@ public: template F> Promise& when_resolved(F handler) { - on_resolution = [handler = move(handler)](Result& result) { return handler(result); }; - if (is_resolved()) { - auto handler_result = on_resolution(m_result_or_rejection->value()); - possibly_handle_rejection(handler_result); - } - - return *this; + return when_resolved([handler = move(handler)](Result& result) -> ErrorOr { + handler(result); + return {}; + }); } template, Result&> F>