Skip to content

Commit

Permalink
feat: add noRejectIsNotActual to params
Browse files Browse the repository at this point in the history
  • Loading branch information
Krivega committed Mar 15, 2023
1 parent 50ef174 commit c0e2b64
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 9 deletions.
33 changes: 31 additions & 2 deletions src/__tests__/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,8 +158,8 @@ describe('creteStackPromises', () => {
});
});

const resultAfter1 = stackPromises.add(request1)();
const resultAfter2 = stackPromises.add(request2)();
const resultAfter1 = stackPromises.run(request1);
const resultAfter2 = stackPromises.run(request2);

return Promise.allSettled([resultAfter1, resultAfter2]).then((args) => {
// @ts-ignore
Expand All @@ -173,6 +173,35 @@ describe('creteStackPromises', () => {
});
});

it('2 promise: async: noRejectIsNotActual', () => {
expect.assertions(5);

let checkQue = 0;
const request1 = jest.fn(() => {
return delayPromise(3, 1).finally(() => {
checkQue += 1;
});
});
const request2 = jest.fn(() => {
return delayPromise(1, 2).finally(() => {
checkQue *= 2;
});
});

stackPromises = creteStackPromises<number>({ noRejectIsNotActual: true });

const resultAfter1 = stackPromises.run(request1);
const resultAfter2 = stackPromises.run(request2);

return Promise.all([resultAfter1, resultAfter2]).then(([value1, value2]) => {
expect(value1).toBe(1);
expect(value2).toBe(2);
expect(checkQue).toBe(2);
expect(request1).toHaveBeenCalledTimes(1);
expect(request2).toHaveBeenCalledTimes(1);
});
});

it('1 promise rejected', () => {
expect.assertions(1);

Expand Down
27 changes: 20 additions & 7 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,11 @@ const notFunctionError = new Error(
'stackPromises only works with functions that returns a Promise'
);

const creteStackPromises = <T = any>() => {
const creteStackPromises = <T = any>({
noRejectIsNotActual = false,
}: {
noRejectIsNotActual?: boolean;
} = {}) => {
type TPromise = Promise<T>;
type TTask = () => TPromise;
type TRunner = () => TPromise;
Expand Down Expand Up @@ -70,18 +74,27 @@ const creteStackPromises = <T = any>() => {
return ({ results, isSuccessful }: { results: T[]; isSuccessful: boolean }) => {
const sizePromises = results.length;
const sizeStackPromises = runnersStack.length;
const isActual = sizePromises === sizeStackPromises;

if (sizePromises === sizeStackPromises) {
if (isActual) {
const lastResult = results[results.length - 1];

if (isSuccessful) {
resolve(lastResult);
} else {
reject(lastResult);
return resolve(lastResult);
}
} else {
reject(promiseIsNotActualError);

return reject(lastResult);
}

if (noRejectIsNotActual) {
const lastResult = results[results.length - 1];

return resolve(lastResult);
}

reject(promiseIsNotActualError);

return undefined;
};
};

Expand Down

0 comments on commit c0e2b64

Please sign in to comment.