summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Early <alexander.early@gmail.com>2016-03-07 23:46:01 -0800
committerAlexander Early <alexander.early@gmail.com>2016-03-07 23:46:01 -0800
commita211146f9c67057797fdce69446e1eb765616575 (patch)
tree45161bd49c18964582ad4c48d4c6413e65cf0361
parent831f37f2a27ec262159190fa3165d428010c7813 (diff)
downloadasync-a211146f9c67057797fdce69446e1eb765616575.tar.gz
added retryable wrapper for async tasks
-rw-r--r--lib/index.js3
-rw-r--r--lib/retryable.js11
-rw-r--r--mocha_test/retryable.js65
-rwxr-xr-xtest/test-async.js42
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'] = {