LibCore: Accept any Promise<T> in Promise::after()

This commit is contained in:
Ali Mohammad Pur 2025-06-18 08:36:30 +02:00 committed by Ali Mohammad Pur
commit e47b1cc1a2
Notes: github-actions[bot] 2025-06-25 06:21:50 +00:00

View file

@ -24,7 +24,8 @@ public:
Function<ErrorOr<void>(Result&)> on_resolution; Function<ErrorOr<void>(Result&)> on_resolution;
Function<void(ErrorType&)> on_rejection; Function<void(ErrorType&)> on_rejection;
static NonnullRefPtr<Promise> after(Vector<NonnullRefPtr<Promise>>&& promises) template<typename U>
static NonnullRefPtr<Promise> after(Vector<NonnullRefPtr<Promise<U>>> promises)
{ {
auto promise = Promise::construct(); auto promise = Promise::construct();
struct Resolved : RefCounted<Resolved> { struct Resolved : RefCounted<Resolved> {
@ -35,24 +36,32 @@ public:
size_t count { 0 }; size_t count { 0 };
size_t needed { 0 }; size_t needed { 0 };
Optional<Error> error;
}; };
auto resolved = make_ref_counted<Resolved>(promises.size()); auto resolved = make_ref_counted<Resolved>(promises.size());
auto weak_promise = promise->template make_weak_ptr<Promise>(); auto weak_promise = promise->template make_weak_ptr<Promise>();
for (auto p : promises) { for (auto p : promises) {
p->when_resolved([weak_promise, resolved](Result&) -> ErrorOr<void> { p->when_resolved([weak_promise, resolved](auto&&) -> ErrorOr<void> {
if (!weak_promise || weak_promise->is_rejected()) if (!weak_promise || weak_promise->is_rejected())
return {}; return {};
if (++resolved->count == resolved->needed) if (++resolved->count == resolved->needed) {
weak_promise->resolve({}); if (resolved->error.has_value())
weak_promise->reject(resolved->error.release_value());
else
weak_promise->resolve({});
}
return {}; return {};
}); });
p->when_rejected([weak_promise, resolved](ErrorType& error) { p->when_rejected([weak_promise, resolved](auto&& error) {
++resolved->count; resolved->error = move(error);
if (weak_promise) if (!weak_promise)
weak_promise->reject(move(error)); return;
if (++resolved->count == resolved->needed)
weak_promise->reject(resolved->error.release_value());
}); });
promise->add_child(*p); promise->add_child(*p);