mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-05 07:41:01 +00:00
LibCore: Accept any Promise<T> in Promise::after()
This commit is contained in:
parent
536f8c395c
commit
e47b1cc1a2
Notes:
github-actions[bot]
2025-06-25 06:21:50 +00:00
Author: https://github.com/alimpfard
Commit: e47b1cc1a2
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/5127
1 changed files with 17 additions and 8 deletions
|
@ -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) {
|
||||||
|
if (resolved->error.has_value())
|
||||||
|
weak_promise->reject(resolved->error.release_value());
|
||||||
|
else
|
||||||
weak_promise->resolve({});
|
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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue