diff --git a/lib/async.js b/lib/async.js index c862008ae..fb34c6889 100644 --- a/lib/async.js +++ b/lib/async.js @@ -439,12 +439,15 @@ else { var args = Array.prototype.slice.call(arguments, 1); var next = iterator.next(); + var iteratorCallback; if (next) { - args.push(wrapIterator(next)); + iteratorCallback = wrapIterator(next); } else { - args.push(callback); + iteratorCallback = callback; } + iteratorCallback.final = callback; + args.push(iteratorCallback); async.nextTick(function () { iterator.apply(null, args); }); diff --git a/test/test-async.js b/test/test-async.js index d3eeddcb5..a9dc56cea 100644 --- a/test/test-async.js +++ b/test/test-async.js @@ -209,6 +209,31 @@ exports['waterfall multiple callback calls'] = function(test){ async.waterfall(arr); }; +exports['waterfall final'] = function(test){ + var call_order = []; + var arr = [ + function(callback){ + call_order.push(1); + callback(); + }, + function(callback){ + call_order.push(2); + callback.final(null, 'a result'); + }, + function(callback){ + test.ok(false, 'next callback should not be reached'); + call_order.push(3); + callback(); + } + ]; + async.waterfall(arr, function(err, result){ + call_order.push(4); + test.same(call_order, [1, 2, 4], 'call order'); + test.equal(err, null, 'no error should be passed'); + test.equal(result, 'a result'); + test.done(); + }); +}; exports['parallel'] = function(test){ var call_order = [];