From e47b1cc1a2d3c059b211ba31bcfe4be86b6b121a Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Wed, 18 Jun 2025 08:36:30 +0200 Subject: [PATCH] LibCore: Accept any Promise in Promise::after() --- Libraries/LibCore/Promise.h | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/Libraries/LibCore/Promise.h b/Libraries/LibCore/Promise.h index f3de87e798e..47e927e7ff6 100644 --- a/Libraries/LibCore/Promise.h +++ b/Libraries/LibCore/Promise.h @@ -24,7 +24,8 @@ public: Function(Result&)> on_resolution; Function on_rejection; - static NonnullRefPtr after(Vector>&& promises) + template + static NonnullRefPtr after(Vector>> promises) { auto promise = Promise::construct(); struct Resolved : RefCounted { @@ -35,24 +36,32 @@ public: size_t count { 0 }; size_t needed { 0 }; + Optional error; }; auto resolved = make_ref_counted(promises.size()); auto weak_promise = promise->template make_weak_ptr(); for (auto p : promises) { - p->when_resolved([weak_promise, resolved](Result&) -> ErrorOr { + p->when_resolved([weak_promise, resolved](auto&&) -> ErrorOr { if (!weak_promise || weak_promise->is_rejected()) return {}; - if (++resolved->count == resolved->needed) - weak_promise->resolve({}); + if (++resolved->count == resolved->needed) { + if (resolved->error.has_value()) + weak_promise->reject(resolved->error.release_value()); + else + weak_promise->resolve({}); + } return {}; }); - p->when_rejected([weak_promise, resolved](ErrorType& error) { - ++resolved->count; - if (weak_promise) - weak_promise->reject(move(error)); + p->when_rejected([weak_promise, resolved](auto&& error) { + resolved->error = move(error); + if (!weak_promise) + return; + + if (++resolved->count == resolved->needed) + weak_promise->reject(resolved->error.release_value()); }); promise->add_child(*p);