sumory
7/16/2013 - 12:49 PM

nonBlockingForEach.js

/**
 * Allow other processes to execute while iterating over 
 * an array. Useful for large arrays, or long-running processing
 *
 * @param {Function} fn    iterator fed each element of the array.
 * @param {Function} next  executed when done
 */
Array.prototype.nonBlockingForEach = function(fn, next) {
  var arr = this;
  var i = 0;
  var len = arr.length;
  function iter() {
    if (i < len) {
      fn(arr[i]);
      i++;
      process.nextTick(iter);
    } else {
      next();
    }
  }
  iter();
};