diff --git a/lib/async.js b/lib/async.js index 5321709..601dd1e 100644 --- a/lib/async.js +++ b/lib/async.js @@ -1,27 +1,42 @@ /** - * @param {Array} array + * @param {Object|Array} array * @param {Function} action * @param {Function} [callback] * @example * abc.async([url1, url2], function (url, callback) { ... }, function () {}) * abc.async([func1, func2], function () {}); + * abc.async({one: url1, two: url2}, function (url, callback) { ... }, function () {}) + * abc.async({one: func1, two: func2}, function () {}); */ exports.forEach = function (array, action, callback) { - var results = []; if (!callback) { callback = action; action = function (item, callback) { item(callback); }; } - if (!array.length) { + + var counter, + results, + each; + + if (Array.isArray(array)) { + counter = array.length; + results = []; + each = arrEach; + } else { + counter = Object.keys(array).length; + results = {}; + each = objEach; + } + + if (!counter) { callback(results); } else { - var loadCounter = 0; - array.forEach(function (item, index) { + each(array, function (item, k) { action(item, function (result) { - results[index] = result; - if (++loadCounter === array.length) { + results[k] = result; + if (!counter--) { callback(results); } }); @@ -29,6 +44,14 @@ exports.forEach = function (array, action, callback) { } }; +function arrEach(arr, iter) { + arr.forEach(iter); +} +function objEach (arr, iter) { + for (var k in arr) { + iter(arr[k], k) + } +} /** * @param {Array} array * @param {Function} action diff --git a/test/async/for-each-object-2args.case.js b/test/async/for-each-object-2args.case.js new file mode 100644 index 0000000..2f55da3 --- /dev/null +++ b/test/async/for-each-object-2args.case.js @@ -0,0 +1,16 @@ +//in +var async = require(tc.fixPath('../../lib/async.js')); +var arr = { + one: function () {return 1}, + two: function () {return 2}, + three: function () {return 3} +}; +async.forEach( + arr, + function (autoResults) { + tc.out([results.one, results.two, results.three]); + tc.finish(); + } +) +//out +1,2,3 diff --git a/test/async/for-each-object-3args.case.js b/test/async/for-each-object-3args.case.js new file mode 100644 index 0000000..4e523ba --- /dev/null +++ b/test/async/for-each-object-3args.case.js @@ -0,0 +1,15 @@ +//in +var async = require(tc.fixPath('../../lib/async.js')); +var arr = {one:1, two:2, three:3}; +async.forEach( + arr, + function (value, callback) { + callback(value * 2); + }, + function (autoResults) { + tc.out([results.one, results.two, results.three]); + tc.finish(); + } +) +//out +2,4,6