LibCore: Fix compilation of infallible Promise::when_resolved handlers

This overload is currently unused. When used, it doesn't compile due to
mismatched return types in the handler provided to the function and the
type of `on_resolution`.
This commit is contained in:
Timothy Flynn 2023-12-31 09:40:43 -05:00 committed by Andreas Kling
parent 75e60d3a68
commit c190294a76
Notes: sideshowbarker 2024-07-17 08:13:43 +09:00
2 changed files with 24 additions and 7 deletions

View file

@ -61,6 +61,26 @@ TEST_CASE(promise_chain_handlers)
EXPECT(!rejected); EXPECT(!rejected);
} }
TEST_CASE(infallible_promise_chain_handlers)
{
Core::EventLoop loop;
bool resolved = false;
bool rejected = false;
NonnullRefPtr<Core::Promise<int>> promise = MUST(Core::Promise<int>::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) TEST_CASE(promise_map)
{ {
Core::EventLoop loop; Core::EventLoop loop;

View file

@ -82,13 +82,10 @@ public:
template<CallableAs<void, Result&> F> template<CallableAs<void, Result&> F>
Promise& when_resolved(F handler) Promise& when_resolved(F handler)
{ {
on_resolution = [handler = move(handler)](Result& result) { return handler(result); }; return when_resolved([handler = move(handler)](Result& result) -> ErrorOr<void> {
if (is_resolved()) { handler(result);
auto handler_result = on_resolution(m_result_or_rejection->value()); return {};
possibly_handle_rejection(handler_result); });
}
return *this;
} }
template<CallableAs<ErrorOr<void>, Result&> F> template<CallableAs<ErrorOr<void>, Result&> F>