module.exports = function (arr, iterator, callback) { callback = callback || function () {}; if (!Array.isArray(arr) || !arr.length) { return callback(); } var completed = 0; var iterate = function () { iterator(arr[completed], function (err) { if (err) { callback(err); callback = function () {}; } else { ++completed; if (completed >= arr.length) { callback(); } else { nextTick(iterate); } } }); }; iterate(); }; function nextTick (cb) { if (typeof setImmediate === 'function') { setImmediate(cb); } else { process.nextTick(cb); } }