-
Notifications
You must be signed in to change notification settings - Fork 1
/
race_promise.ts
34 lines (30 loc) · 1 KB
/
race_promise.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import Bluebird from 'bluebird';
export async function racePromiseRecord<Keys extends string>(
raceable: Record<Keys, Promise<any>>
): Promise<Record<Keys, any>> {
const [resolvedKey, resolvedValue] = await new Promise<[string, any]>((resolve, reject) => {
Object.entries<Promise<any>>(raceable).forEach(([key, promiseValue]) => {
promiseValue.then(
value => resolve([key, value]),
err => reject(err)
);
});
});
const withNullifiedValues = Object.keys(raceable).reduce((record, keyName) => {
return {
...record,
[keyName]: null
};
}, {} as Record<Keys, null>);
return {
...withNullifiedValues,
[resolvedKey]: resolvedValue
};
}
export async function racePromise(raceable: Array<Promise<any>> | Record<string, Promise<any>>) {
if (Array.isArray(raceable)) {
return Bluebird.race(raceable);
} else {
return racePromiseRecord(raceable);
}
}