diff --git a/lib/async.js b/lib/async.js index cb6320d6a..c6d37e95a 100755 --- a/lib/async.js +++ b/lib/async.js @@ -121,6 +121,24 @@ }; async.forEach = async.each; + async.filterWithError = function (iterable, iterator, callback) { + async.map(iterable, function (each, callback) { + iterator(each, function (err, condition) { + callback(null, { each: each, condition: condition }); + }); + }, function (err, results) { + if (err) { + return callback(err); + } + + callback(null, results.filter(function (each) { + return each.condition; + }).map(function (each) { + return each.each; + })); + }); + }; + async.eachSeries = function (arr, iterator, callback) { callback = callback || function () {}; if (!arr.length) { diff --git a/test/test-async.js b/test/test-async.js index ff401e75b..825d7aa3f 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -1215,6 +1215,18 @@ exports['filterSeries'] = function(test){ }); }; +exports['filterWithError'] = function(test){ + async.filterWithError([3,1,2], function (each, callback) { + filterIterator(each, function (result) { + callback(null, result); + }); + }, function(err, results){ + test.equals(err, null); + test.same(results, [3,1]); + test.done(); + }); +}; + exports['select alias'] = function(test){ test.equals(async.select, async.filter); test.done();