softkave-js-utils
Version:
JavaScript & Typescript utility functions, types, and classes
55 lines • 1.58 kB
JavaScript
import { isObjectEmpty } from '../object/isObjectEmpty.js';
import { getDeferredPromise } from './getDeferredPromise.js';
export const kConjoinedPromiseSettlementType = {
/** Resolves when all the promises added to it are resolved, and rejects when
* one of them is rejected. */
all: 'a',
/** Resolves when all the promises added to it are resolved. */
allSettled: 's',
};
/** Returns a promise that resolves when all the promises added to it are
* resolved. */
export function getConjoinedPromise(params) {
const p = getDeferredPromise();
const pMap = {};
let iteration = 0;
let isStarted = false;
const onSettled = (id) => {
delete pMap[id];
if (isObjectEmpty(pMap) && isStarted) {
p.resolve();
}
};
const onRejected = (id, error) => {
delete pMap[id];
if (isStarted) {
p.reject(error);
}
};
const add = (p) => {
const id = iteration++;
pMap[id] = p;
if (params.settlementType === kConjoinedPromiseSettlementType.all) {
p.then(() => onSettled(id)).catch(error => onRejected(id, error));
}
else {
p.finally(() => onSettled(id));
}
return p;
};
const newDeferred = () => {
const p = getDeferredPromise();
add(p.promise);
return p;
};
const start = () => {
isStarted = true;
};
return {
add,
newDeferred,
start,
deferredPromise: p,
};
}
//# sourceMappingURL=getConjoinedPromise.js.map