parallel-debug.js revision 16dc9aab6798bb50c391d6a5dd99c16ae95f501f
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav GlassYUI.add('parallel', function(Y) {
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass/**
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass* A concurrent parallel processor to help in running several async functions.
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass* @module parallel
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass* @main parallel
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass*/
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass/**
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav GlassA concurrent parallel processor to help in running several async functions.
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass@class Parallel
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass@example
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass var stack = new Y.Parallel();
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass for (var i = 0; i < 15; i++) {
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass Y.io('./api/json/' + i, {
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass on: {
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass success: stack.add(function() {
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass Y.log('Done!');
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass })
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass }
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass });
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass }
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass stack.done(function() {
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass Y.log('All IO requests complete!');
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass });
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass@param {Object} o A config object
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass@param {Object} [o.context=Y] The execution context of the callback to done
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass*/
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav GlassY.Parallel = function(o) {
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass this.config = o || {};
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass this.results = [];
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass this.context = this.config.context || Y;
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass this.total = 0;
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass this.finished = 0;
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass};
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav GlassY.Parallel.prototype = {
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass /**
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * An Array of results from all the callbacks in the stack
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * @property {Array} results
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * @private
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass */
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass results: null,
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass /**
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * The total items in the stack
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * @property {Number} total
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * @private
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass */
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass total: null,
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass /**
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * The number of stacked callbacks executed
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * @property {Number} finished
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * @private
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass */
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass finished: null,
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass /**
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * Add a callback to the stack
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * @method add
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * @param {Function} fn The function callback we are waiting for
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass */
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass add: function (fn) {
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass var self = this;
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass self.total += 1;
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass return function () {
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass self.finished++;
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass self.results.push(fn.apply(self.context, arguments));
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass self.test();
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass }
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass },
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass /**
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * Test to see if all registered items in the stack have completed, if so call the callback to `done`
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * @method test
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass */
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass test: function () {
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass var self = this;
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass if (self.finished >= self.total && self.callback) {
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass self.callback.call(self.context, self.results, self.data);
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass }
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass },
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass /**
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * The method to call when all the items in the stack are complete.
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * @method done
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * @param {Function} callback The callback to execute on complete
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * @param {Mixed} callback.results The results of all the callbacks in the stack
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * @param {Mixed} [callback.data] The data given to the `done` method
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass * @param {Mixed} data Mixed data to pass to the success callback
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass */
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass done: function (callback, data) {
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass this.callback = callback;
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass this.data = data;
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass this.test();
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass }
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass};
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass
16dc9aab6798bb50c391d6a5dd99c16ae95f501fDav Glass}, '@VERSION@' ,{requires:['yui-base']});