retry-unless v1.0.0
Retry Unless
A cross between async retry which does not have a early breakout function, and
other back off libraries like exp-backoff which have no documentation
or are difficult to understand how to make work.
Install
npm install --save retry-unlessUsage
var retry = require( 'retry-unless' );
retry( options, yourFunction, yourBreakoutCheck, finallFunction );The options are the same as async.retry. For example:
{
times: 5,
interval: 200
}Where times is the maximum number of tries that will be made and interval is either the number of milliseconds to wait between
tries, or is a function that takes the current retry count as an argument and must return a number of milliseconds to wait for the
next try.
yourFunction is, well your function! It must be function using the standard callback (err, data) node pattern.
yourBreakoutCheck is a function that takes the last error returned from yourFunction and the current retry count, and should
return true if we should stop trying, or false if we should continue trying.
finalFunction is called when we're done, and takes ( err, data ), where err is the last error returned from yourFunction (if any)
and data is the last data returned from yourFunction.
Practical Example
In this example, we're going to keep trying to call a troublesome cloud service until the serivce finally accepts our request, or we give up trying.
var retry = require( 'retry-unless' );
var request = require( 'request' );
retry({
times: 6,
interval: function( retryCount ) {
// exponential back off
var delay = 50 * Math.pow( 2, retryCount );
return delay;
}
}, function( cb ) {
// give it a shot...
request.post( 'http://free-tier.com/submit_payment', info, cb );
}, function( err, count ) {
// return true if we should stop, false if we should continue
// ie. keep trying as long as we keep getting "your credit card is expired"
// back from free-tier. Any other error should stop retrying.
if ( err.message.match( /your credit card is expired/ ) ) return false;
else return true;
}, function( err, data ) {
if ( err ) console.log( 'FINAL ERROR:', err );
if ( data ) console.log( 'FINAL DATA:', data );
process.exit( 1 );
});9 years ago