A lightweight module (~0.5kb) to retry an async job until the job success or stop after a maximum number of tries
-
Install package
npm install tiny-retry # or yarn add tiny-retry
-
Use it
import retry from "tiny-retry"; // Async context const result = await retry(asyncJob, options); if (result.success) { // Do something with job data console.log(result.data) } else { // Do other thing }
const result = await retry(asyncJob, { maxTries, delay, startAfter, process, errorHandler, check });
asyncJob
[Function]: async function that throw anError
if failedoptions
[Object]: Retry optionsoptions.maxTries
[Number]: number of maximum time to try to run joboptions.delay
[Number]: the number in miliseconds of time after between each triesoptions.starAfter
[Number]: the number in miliseconds to start the 1st tryoptions.process
[Function]: A process function to run before each try with thetries
count argumentoptions.errorHandler
[Function]: A function to handle error in each try with theerr
argumentoptions.check
[Function]: A function with the job reponse argument to verify whether the job response is expected or not (throw anError
if not)
result
[Object]: Represent the value of the job done or not and include job's data (if job return)result.success
[Boolean]: Whether the job success or notresult.tries
[Number]: Number of tries[result.data]
[Number]: The return value of job if success
console.log(result)
// Expect: { success: true, data: "Async job data", tries }
// If job failed: { success: false, tries }
import retry from "tiny-retry";
const wait = (secs) => new Promise((resolve) => setTimeout(resolve, secs));
let count = 0;
const fakeJobThatDoneAfter6Tries = async () => {
await wait(2000);
count += 1;
if (count < 4) {
throw new Error('Job failed!');
} else if (count < 6) {
return false
} else {
console.log('Job done!');
return "Job data"
}
};
(async () => {
console.log("Start Job");
console.time("JOB_COST");
const result = await retry(fakeJobThatDoneAfter6Tries, {
process: (tries) => console.log(`[TRY]: ${tries} time(s)`),
errorHandler: (err) => console.log(err.toString()),
check: Boolean,
maxTries: 10,
delay: 1000,
startAfter: 0
});
console.log("Job result: ", result);
console.log("Time expect: 0 + 2*6 + 1*(6-1) = 17s");
console.timeEnd("JOB_COST"); // Expect 17s
})();
Bundled by me from the ideas' combination of me and my friend.
Copyright (c) 2021 Leo Huynh @ https://leohuynh.dev under MIT LICENSE