зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1626278: Implement MozPromise::AllSettled, based on JS Promise API. r=jya
Differential Revision: https://phabricator.services.mozilla.com/D91467
This commit is contained in:
Родитель
9599563a0c
Коммит
e0c988cd55
|
@ -291,6 +291,9 @@ class MozPromise : public MozPromiseBase {
|
||||||
IsExclusive>
|
IsExclusive>
|
||||||
AllPromiseType;
|
AllPromiseType;
|
||||||
|
|
||||||
|
typedef MozPromise<CopyableTArray<ResolveOrRejectValue>, bool, IsExclusive>
|
||||||
|
AllSettledPromiseType;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class AllPromiseHolder : public MozPromiseRefcountable {
|
class AllPromiseHolder : public MozPromiseRefcountable {
|
||||||
public:
|
public:
|
||||||
|
@ -340,6 +343,50 @@ class MozPromise : public MozPromiseBase {
|
||||||
size_t mOutstandingPromises;
|
size_t mOutstandingPromises;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Trying to pass ResolveOrRejectValue by value fails static analysis checks,
|
||||||
|
// so we need to use either a const& or an rvalue reference, depending on
|
||||||
|
// whether IsExclusive is true or not.
|
||||||
|
typedef std::conditional_t<IsExclusive, ResolveOrRejectValue&&,
|
||||||
|
const ResolveOrRejectValue&>
|
||||||
|
ResolveOrRejectValueParam;
|
||||||
|
|
||||||
|
class AllSettledPromiseHolder : public MozPromiseRefcountable {
|
||||||
|
public:
|
||||||
|
explicit AllSettledPromiseHolder(size_t aDependentPromises)
|
||||||
|
: mPromise(new typename AllSettledPromiseType::Private(__func__)),
|
||||||
|
mOutstandingPromises(aDependentPromises) {
|
||||||
|
MOZ_ASSERT(aDependentPromises > 0);
|
||||||
|
mValues.SetLength(aDependentPromises);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Settle(size_t aIndex, ResolveOrRejectValueParam aValue) {
|
||||||
|
if (!mPromise) {
|
||||||
|
// Already rejected.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mValues[aIndex].emplace(MaybeMove(aValue));
|
||||||
|
if (--mOutstandingPromises == 0) {
|
||||||
|
nsTArray<ResolveOrRejectValue> values;
|
||||||
|
values.SetCapacity(mValues.Length());
|
||||||
|
for (auto&& value : mValues) {
|
||||||
|
values.AppendElement(std::move(value.ref()));
|
||||||
|
}
|
||||||
|
|
||||||
|
mPromise->Resolve(std::move(values), __func__);
|
||||||
|
mPromise = nullptr;
|
||||||
|
mValues.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AllSettledPromiseType* Promise() { return mPromise; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
nsTArray<Maybe<ResolveOrRejectValue>> mValues;
|
||||||
|
RefPtr<typename AllSettledPromiseType::Private> mPromise;
|
||||||
|
size_t mOutstandingPromises;
|
||||||
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
[[nodiscard]] static RefPtr<AllPromiseType> All(
|
[[nodiscard]] static RefPtr<AllPromiseType> All(
|
||||||
nsISerialEventTarget* aProcessingTarget,
|
nsISerialEventTarget* aProcessingTarget,
|
||||||
|
@ -364,6 +411,26 @@ class MozPromise : public MozPromiseBase {
|
||||||
return promise;
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] static RefPtr<AllSettledPromiseType> AllSettled(
|
||||||
|
nsISerialEventTarget* aProcessingTarget,
|
||||||
|
nsTArray<RefPtr<MozPromise>>& aPromises) {
|
||||||
|
if (aPromises.Length() == 0) {
|
||||||
|
return AllSettledPromiseType::CreateAndResolve(
|
||||||
|
CopyableTArray<ResolveOrRejectValue>(), __func__);
|
||||||
|
}
|
||||||
|
|
||||||
|
RefPtr<AllSettledPromiseHolder> holder =
|
||||||
|
new AllSettledPromiseHolder(aPromises.Length());
|
||||||
|
RefPtr<AllSettledPromiseType> promise = holder->Promise();
|
||||||
|
for (size_t i = 0; i < aPromises.Length(); ++i) {
|
||||||
|
aPromises[i]->Then(aProcessingTarget, __func__,
|
||||||
|
[holder, i](ResolveOrRejectValueParam aValue) -> void {
|
||||||
|
holder->Settle(i, MaybeMove(aValue));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
|
||||||
class Request : public MozPromiseRefcountable {
|
class Request : public MozPromiseRefcountable {
|
||||||
public:
|
public:
|
||||||
virtual void Disconnect() = 0;
|
virtual void Disconnect() = 0;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче