Remove every() method (redundant with async.io) and rework demo sample

This commit is contained in:
Sami Turcotte
2018-11-28 23:44:59 -05:00
parent 976330134d
commit 0917763540
5 changed files with 22 additions and 115 deletions

View File

@@ -37,44 +37,3 @@ test("once() resolves only after the specified event is emitted", async t => {
expect(after - before).gte(200);
expect(after - before).closeTo(200, TimingErrorMarginMs);
});
test("every() resolves to true when the predicate holds true for all resolved values", async t => {
const before = Date.now();
const result = await every(
[Promise.resolve("a"), Promise.resolve("b"), delay("c", 200)],
() => true,
);
const after = Date.now();
expect(result).equal(true);
expect(after - before).gte(200);
expect(after - before).closeTo(200, TimingErrorMarginMs);
});
test("every() resolves to false as soon as the predicate does not hold for some resolved value", async t => {
const before = Date.now();
const result = await every(
[Promise.resolve("a"), Promise.resolve("bb"), delay("c", 200)],
(value: string) => value.length === 1,
);
const after = Date.now();
expect(result).equal(false);
expect(after - before).lt(200);
expect(after - before).closeTo(0, TimingErrorMarginMs);
});
test("every() rejects with the reason as soon as any of the promises rejects", async t => {
const before = Date.now();
await t.throwsAsync(() =>
every(
[
Promise.resolve("a"),
Promise.reject(new Error("Expected")),
delay("c", 200),
],
() => true,
),
);
const after = Date.now();
expect(after - before).lt(200);
expect(after - before).closeTo(0, TimingErrorMarginMs);
});

View File

@@ -37,48 +37,3 @@ export function once<T>(
});
});
}
/**
* Eagerly resolve to false as soon as any of the promises has resolved to a value for which the
* predicate is falsey, or resolve to true when all of the promises have resolved to a value for which
* the predicate is thruthy, or rejects with the reason of the first promise rejection
*
* @param promises Promises whose resolved values will be tested by the predicate
* @param predicate Predicate to apply
* @returns Promise indicating whether the predicate holds for all resolved promise values
*/
export function every<T>(
promises: Array<Promise<T>>,
predicate: (value: T) => boolean,
): Promise<boolean> {
if (promises.length > 0) {
return new Promise((resolve, reject) => {
let resolvedCount = 0;
let done = false;
promises.forEach(promise => {
promise
.then(value => {
resolvedCount++;
if (!done) {
const predicateValue = predicate(value);
if (!predicateValue) {
resolve(false);
done = true;
} else if (resolvedCount === promises.length) {
resolve(predicateValue);
done = true;
}
}
})
.catch(err => {
if (!done) {
reject(err);
done = true;
}
});
});
});
} else {
return Promise.resolve(true);
}
}