diff options
author | Alexander Early <alexander.early@gmail.com> | 2016-03-07 23:46:01 -0800 |
---|---|---|
committer | Alexander Early <alexander.early@gmail.com> | 2016-03-07 23:46:01 -0800 |
commit | a211146f9c67057797fdce69446e1eb765616575 (patch) | |
tree | 45161bd49c18964582ad4c48d4c6413e65cf0361 | |
parent | 831f37f2a27ec262159190fa3165d428010c7813 (diff) | |
download | async-a211146f9c67057797fdce69446e1eb765616575.tar.gz |
added retryable wrapper for async tasks
-rw-r--r-- | lib/index.js | 3 | ||||
-rw-r--r-- | lib/retryable.js | 11 | ||||
-rw-r--r-- | mocha_test/retryable.js | 65 | ||||
-rwxr-xr-x | test/test-async.js | 42 |
4 files changed, 79 insertions, 42 deletions
diff --git a/lib/index.js b/lib/index.js index 300491d..869ba6e 100644 --- a/lib/index.js +++ b/lib/index.js @@ -49,6 +49,7 @@ import reject from './reject'; import rejectLimit from './rejectLimit'; import rejectSeries from './rejectSeries'; import retry from './retry'; +import retryable from './retryable'; import seq from './seq'; import series from './series'; import setImmediate from './setImmediate'; @@ -115,6 +116,7 @@ export default { rejectLimit: rejectLimit, rejectSeries: rejectSeries, retry: retry, + retryable: retryable, seq: seq, series: series, setImmediate: setImmediate, @@ -199,6 +201,7 @@ export { rejectLimit as rejectLimit, rejectSeries as rejectSeries, retry as retry, + retryable as retryable, seq as seq, series as series, setImmediate as setImmediate, diff --git a/lib/retryable.js b/lib/retryable.js new file mode 100644 index 0000000..5bb3ccd --- /dev/null +++ b/lib/retryable.js @@ -0,0 +1,11 @@ +import retry from './retry'; +import rest from 'lodash/rest'; + +export default function (opts, task) { + return rest(function (args) { + var callback = args.pop(); + retry(opts, function (cb) { + task(...args.concat([cb])); + }, callback); + }); +} diff --git a/mocha_test/retryable.js b/mocha_test/retryable.js new file mode 100644 index 0000000..8cad403 --- /dev/null +++ b/mocha_test/retryable.js @@ -0,0 +1,65 @@ +var async = require('../lib'); +var expect = require('chai').expect; +var assert = require('assert'); + +describe('retryable', function () { + it('basics', function (done) { + var calls = 0; + var retryableTask = async.retryable(3, function (arg, cb) { + calls++; + expect(arg).to.equal(42); + cb('fail'); + }); + + retryableTask(42, function (err) { + expect(err).to.equal('fail'); + expect(calls).to.equal(3); + done(); + }); + + setTimeout(function () { + }, 15); + }); + + // TODO: re-enable when auto's args are swapped + it.skip('should work as an embedded task', function(done) { + var retryResult = 'RETRY'; + var fooResults; + var retryResults; + + async.auto({ + dep: async.constant('dep'), + foo: ['dep', function(results, callback){ + fooResults = results; + callback(null, 'FOO'); + }], + retry: ['dep', async.retryable(function(results, callback) { + retryResults = results; + callback(null, retryResult); + })] + }, function(err, results){ + assert.equal(results.retry, retryResult, "Incorrect result was returned from retry function"); + assert.equal(fooResults, retryResults, "Incorrect results were passed to retry function"); + done(); + }); + }); + + it('should work as an embedded task with interval', function(done) { + var start = new Date().getTime(); + var opts = {times: 5, interval: 100}; + + async.auto({ + foo: function(callback){ + callback(null, 'FOO'); + }, + retry: async.retryable(opts, function(callback) { + callback('err'); + }) + }, function(){ + var duration = new Date().getTime() - start; + var expectedMinimumDuration = (opts.times -1) * opts.interval; + assert(duration >= expectedMinimumDuration, "The duration should have been greater than " + expectedMinimumDuration + ", but was " + duration); + done(); + }); + }); +}); diff --git a/test/test-async.js b/test/test-async.js index 2e04178..1e5dcb1 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -278,48 +278,6 @@ exports['seq without callback'] = function (test) { add2mul3.call(testcontext, 3); }; -// need to fix retry, this isn't working -/* -exports['retry as an embedded task'] = function(test) { - var retryResult = 'RETRY'; - var fooResults; - var retryResults; - - async.auto({ - dep: async.constant('dep'), - foo: ['dep', function(results, callback){ - fooResults = results; - callback(null, 'FOO'); - }], - retry: ['dep', async.retry(function(results, callback) { - retryResults = results; - callback(null, retryResult); - })] - }, function(err, results){ - test.equal(results.retry, retryResult, "Incorrect result was returned from retry function"); - test.equal(fooResults, retryResults, "Incorrect results were passed to retry function"); - test.done(); - }); -}; - -exports['retry as an embedded task with interval'] = function(test) { - var start = new Date().getTime(); - var opts = {times: 5, interval: 100}; - - async.auto({ - foo: function(callback){ - callback(null, 'FOO'); - }, - retry: async.retry(opts, function(callback) { - callback('err'); - }) - }, function(){ - var duration = new Date().getTime() - start; - var expectedMinimumDuration = (opts.times -1) * opts.interval; - test.ok(duration >= expectedMinimumDuration, "The duration should have been greater than " + expectedMinimumDuration + ", but was " + duration); - test.done(); - }); -};*/ exports['waterfall'] = { |