diff --git a/lib/async.js b/lib/async.js index 06ede1475..b8c001b8e 100644 --- a/lib/async.js +++ b/lib/async.js @@ -1255,14 +1255,13 @@ async.applyEachSeries = doSeries(_applyEach); async.forever = function (fn, callback) { + var done = only_once(callback || noop); + var task = ensureAsync(fn); function next(err) { if (err) { - if (callback) { - return callback(err); - } - throw err; + return done(err); } - fn(next); + task(next); } next(); }; diff --git a/test/test-async.js b/test/test-async.js index 6797afeff..eba90e914 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -80,8 +80,10 @@ function getFunctionsObject(call_order) { }; } -exports['forever'] = function (test) { - test.expect(1); +exports['forever'] = { + +'async': function (test) { + test.expect(2); var counter = 0; function addOne(callback) { counter++; @@ -94,8 +96,28 @@ exports['forever'] = function (test) { } async.forever(addOne, function (err) { test.equal(err, 'too big!'); + test.equal(counter, 50); test.done(); }); +}, + +'sync': function (test) { + test.expect(2); + var counter = 0; + function addOne(callback) { + counter++; + if (counter === 50000) { + return callback('too big!'); + } + callback(); + } + async.forever(addOne, function (err) { + test.equal(err, 'too big!'); + test.equal(counter, 50000); + test.done(); + }); +} + }; exports['applyEach'] = function (test) {