Guest User

Untitled

a guest
Aug 15th, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 KB | None | 0 0
  1. /**
  2. *
  3. * iterateAsync
  4. * iterate array or object asynchronously.
  5. *
  6. * @author shinout
  7. *
  8. * @param Object / Array obj : object to iterate.
  9. * @param function fn : function to apply to each key, value.
  10. * arguments order -> function(value, key)
  11. * @param function callback : (optional) callback called when iteration is finished.
  12. * @return void
  13. *
  14. **/
  15.  
  16. function iterateAsync(obj, fn, callback) {
  17. // checking type
  18. if (typeof obj != "object") throw new Error("first arguments must be an array or an object");
  19. if (typeof fn != "function") throw new Error("second arguments must be a function");
  20.  
  21. var self = this; // scope to pass to fn
  22.  
  23. // function to execute fn, returning a flag of whether to run next or not.
  24. var next = (function() {
  25. var k = 0; // current key
  26.  
  27. if (Array.isArray(obj)) { // if array, simply fetch a value by current key
  28. var last = obj.length;
  29. return function() {
  30. fn.call(self, obj[k], k++);
  31. return k < last;
  32. };
  33. }
  34. else { // if object
  35. var keys = Object.keys(obj), last = keys.length;
  36. return function() {
  37. fn.call(self, obj[keys[k]], keys[k++]);
  38. return k < last;
  39. };
  40. }
  41. })();
  42.  
  43. // execution
  44. (function iterate() {
  45. if (next()) process.nextTick(iterate);
  46. else if (typeof callback == "function") callback();
  47. })();
  48. }
  49.  
  50. module.exports = iterateAsync;
  51.  
  52.  
  53. // test
  54. function test() {
  55. var obj = {};
  56.  
  57. for (var i=0; i<100; i++) obj["obj" + i] = i * 2;
  58.  
  59. var arr = [];
  60. for (var i=0; i<100; i++) arr[i] = i * 3;
  61.  
  62.  
  63. iterateAsync(obj, function(v, k) {
  64. console.log(k, "* 2 = ", v);
  65. });
  66.  
  67.  
  68. iterateAsync(arr, function(v, k) {
  69. console.log(k, "* 3 = ", v);
  70. });
  71. }
  72.  
  73. if (typeof exports == 'object' && exports === this) test();
Add Comment
Please, Sign In to add comment