diff --git a/Libraries/LibCore/Promise.h b/Libraries/LibCore/Promise.h index add93c1c074..f3de87e798e 100644 --- a/Libraries/LibCore/Promise.h +++ b/Libraries/LibCore/Promise.h @@ -24,6 +24,43 @@ public: Function(Result&)> on_resolution; Function on_rejection; + static NonnullRefPtr after(Vector>&& promises) + { + auto promise = Promise::construct(); + struct Resolved : RefCounted { + explicit Resolved(size_t n) + : needed(n) + { + } + + size_t count { 0 }; + size_t needed { 0 }; + }; + + 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 { + if (!weak_promise || weak_promise->is_rejected()) + return {}; + + if (++resolved->count == resolved->needed) + weak_promise->resolve({}); + return {}; + }); + + p->when_rejected([weak_promise, resolved](ErrorType& error) { + ++resolved->count; + if (weak_promise) + weak_promise->reject(move(error)); + }); + + promise->add_child(*p); + } + + return promise; + } + void resolve(Result&& result) { m_result_or_rejection = move(result);