Version 3.18.1
Show:

File: parallel/js/parallel.js

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