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');
});