Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- *
- * iterateAsync
- * iterate array or object asynchronously.
- *
- * @author shinout
- *
- * @param Object / Array obj : object to iterate.
- * @param function fn : function to apply to each key, value.
- * arguments order -> function(value, key)
- * @param function callback : (optional) callback called when iteration is finished.
- * @return void
- *
- **/
- function iterateAsync(obj, fn, callback) {
- // checking type
- if (typeof obj != "object") throw new Error("first arguments must be an array or an object");
- if (typeof fn != "function") throw new Error("second arguments must be a function");
- var self = this; // scope to pass to fn
- // function to execute fn, returning a flag of whether to run next or not.
- var next = (function() {
- var k = 0; // current key
- if (Array.isArray(obj)) { // if array, simply fetch a value by current key
- var last = obj.length;
- return function() {
- fn.call(self, obj[k], k++);
- return k < last;
- };
- }
- else { // if object
- var keys = Object.keys(obj), last = keys.length;
- return function() {
- fn.call(self, obj[keys[k]], keys[k++]);
- return k < last;
- };
- }
- })();
- // execution
- (function iterate() {
- if (next()) process.nextTick(iterate);
- else if (typeof callback == "function") callback();
- })();
- }
- module.exports = iterateAsync;
- // test
- function test() {
- var obj = {};
- for (var i=0; i<100; i++) obj["obj" + i] = i * 2;
- var arr = [];
- for (var i=0; i<100; i++) arr[i] = i * 3;
- iterateAsync(obj, function(v, k) {
- console.log(k, "* 2 = ", v);
- });
- iterateAsync(arr, function(v, k) {
- console.log(k, "* 3 = ", v);
- });
- }
- if (typeof exports == 'object' && exports === this) test();
Add Comment
Please, Sign In to add comment