async retry 2
by Matthew Vasallo
JavaScript
let stopRetry = false;
const asyncRetry = (asyncFn, count) => {
let result = asyncFn();
let asyncWithDelayFn = () => getDelayedPromise(3000).then(asyncFn);
for (let i = count; i > 0; i -= 1) {
result = result.catch((asyncWithDelayFn));
}
return result;
};
const getDelayedPromise = (delay = 0) => {
console.log("delayed promise called");
return new Promise((res, rej) => {
if (stopRetry) {
res();
}
setTimeout(() => {
res();
}, delay);
});
};
const getAsyncFn = (timesToFail = 2) => {
let failCount = 0;
return () => {
return new Promise((res, rej) => {
if (failCount < timesToFail) {
failCount++;
console.log("asyncFn rejected");
rej("asyncFn simulate failure");
} else {
failCount = 0;
console.log("asyncFn successful");
res("asyncFn simulate success");
}
});
};
};
const getAsyncTimeoutFn = (timesToFail = 2, delay = 0) => {
let failCount = 0;
return () => {
console.log("calling asyncFn");
return new Promise((res, rej) => {
setTimeout(() => {
if (failCount < timesToFail) {
failCount++;
console.log("asyncFn rejected");
rej("asyncFn simulate failure");
} else {
failCount = 0;
console.log("asyncFn successful");
res("asyncFn simulate success");
}
}, delay);
});
};
};
/* setTimeout(() => {
stopRetry = true;
}, 1000); */
asyncRetry(getAsyncFn(3), 4).then(() => {
console.log('completed');
}).catch(() => {
console.log('failed');
});