mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-29 20:29:18 +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<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();
|
||||
struct Resolved : RefCounted<Resolved> {
|
||||
|
@ -35,24 +36,32 @@ public:
|
|||
|
||||
size_t count { 0 };
|
||||
size_t needed { 0 };
|
||||
Optional<Error> error;
|
||||
};
|
||||
|
||||
auto resolved = make_ref_counted<Resolved>(promises.size());
|
||||
auto weak_promise = promise->template make_weak_ptr<Promise>();
|
||||
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())
|
||||
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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue