A more intuitive node-retry
which behaves more like async.retry
. Utilizes Backo
under the hood for backoff.
Retryme also supports async/await
now for retrying async attempt functions.
Here's the example of how to use retryme
in normal ways.
var Retryme = require('retryme');
//
// This function will have the same arguments as the function being attempted
// `opts` here include `min` `max` for Backo configuration as well as `retries`.
//
var operation = new Retryme({
retries: 2,
min: 50,
max: 10000
});
operation.attempt((next) => {
request('https://whatever.com', (err, res, body) => {
if (err || res.statusCode !== 200) {
return next(err || new Error(`Invalid status code ${res.statusCode}`));
}
next(null, body);
}, (err, body) => {
if (err) return /* handle me */
console.dir(body);
});
Now if we want to ignore certain types of errors, we pass a function for configuring those cases
var retry = require('retryme');
const op = retry.op(err => err.message.includes('404'));
op.attempt(next => {
request('https://whatever.com', (err, res, body) => {
if (err || res.statusCode !== 200) {
// any 404 error here will no longer be retried due to the function above
return next(err || new Error(`Invalid status code ${res.statusCode}`));
}
next(null, body);
});
}, (err, body) => {
if (err) return /* handle me */
console.dir(body);
});
Retryme now supports async/await
by providing .async
function to retry async attempt functions.
A simple example of how to use it is as follows:
// example of calling the method for async functions returning Promises.
const readFileAsync = require('util').promisify(require('fs').readFile);
const Retryme = require('retryme');
async function main() {
const op = new Retryme({
retries: 2,
min: 50,
max: 10000
}, some_ignore_function_if_exists);
// Wrap a simple file read with retries.
try {
const fileContent = await op.async(() => readFileAsync(__dirname + '/index.js'));
} catch(err) {
console.log('error after 2 attempts');
console.error(err);
}
}
// it supports async functions
async function foo(bad) {
if (bad !== 'hola') return 'bar';
throw Error('what happened');
}
async function main() {
const op = new Retryme();
try {
const result = await op.async(() => foo('hello'));
} catch(err) {
console.error(err);
}
}
// it also supports thenables
async function main() {
await op.async(() => {
return {
then: (f, r) => {
// real functionality happens here
}
};
});
}
npm test