From 7bb985c013caceef40216dd809caa225a7900506 Mon Sep 17 00:00:00 2001 From: Oliver Salzburg Date: Thu, 20 Aug 2015 19:33:53 +0200 Subject: [PATCH] feat(main): allow retries to be limited --- README.md | 1 + index.js | 7 +++++++ test/main.spec.js | 23 +++++++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/README.md b/README.md index 3ecd43d..92aa5ea 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ var retryInstance = new Retry({ * **retryBase** – the base of the delay exponent. Defaults to `1.2`. * **retryExponent** – the maximum exponent of the delay exponent. If retries are higher than `retryExponent`, `retryExponent` will be used rather than the retry number. Defaults to `33` which means on average max delay of 3m 25s. * **retryDelay** – a function used to calculate the delay. Replaces the default exponent calculation. If it returns `false` the retries will be aborted. +* **retryLimit** – maximum amount of retries. Defaults to unlimited retries. * **log** – a logger function. Defaults to `console.log()`. ## Methods diff --git a/index.js b/index.js index 37e47b0..4c1542b 100644 --- a/index.js +++ b/index.js @@ -18,6 +18,7 @@ var Retry = function (options) { retryMin: 0, retryBase: 1.2, retryExponent: 33, + retryLimit: undefined, retryDelay: function (retries) { return resolvedOptions.retryMin + Math.floor( 1000 * @@ -76,6 +77,12 @@ Retry.prototype._try = function () { self.retrying = undefined; self.abort = undefined; + + if (self.options.retryLimit !== undefined && self.failures >= self.options.retryLimit) { + self.end(); + return Promise.reject(new Error('Retry limit reached')); + } + return self._try(); }); }; diff --git a/test/main.spec.js b/test/main.spec.js index e9fce21..85559b1 100644 --- a/test/main.spec.js +++ b/test/main.spec.js @@ -359,6 +359,29 @@ describe('Retry', function () { }); }); + it('should abort retries after limit is reached', function () { + tryStub.rejects(new Error('foo')); + + retryInstance = new Retry({ + try: tryStub, + success: successSpy, + end: endSpy, + retryDelay: retryStub, + log: function () {}, + retryLimit: 0 + }); + + return retryInstance.try().catch(function (err) { + err.should.be.an('Error'); + err.message.should.equal('Retry limit reached'); + + tryStub.should.have.been.calledOnce; + successSpy.should.not.have.been.called; + endSpy.should.not.have.been.called; + retryStub.should.not.have.been.called; + }); + }); + }); });