PageRenderTime 29ms CodeModel.GetById 19ms app.highlight 7ms RepoModel.GetById 0ms app.codeStats 0ms

/ext-4.0.7/src/data/Batch.js

https://bitbucket.org/srogerf/javascript
JavaScript | 193 lines | 68 code | 27 blank | 98 comment | 7 complexity | 6836ad82c57ee827618f5b5848d47a7c MD5 | raw file
  1/*
  2
  3This file is part of Ext JS 4
  4
  5Copyright (c) 2011 Sencha Inc
  6
  7Contact:  http://www.sencha.com/contact
  8
  9GNU General Public License Usage
 10This file may be used under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation and appearing in the file LICENSE included in the packaging of this file.  Please review the following information to ensure the GNU General Public License version 3.0 requirements will be met: http://www.gnu.org/copyleft/gpl.html.
 11
 12If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact.
 13
 14*/
 15/**
 16 * @author Ed Spencer
 17 * @class Ext.data.Batch
 18 *
 19 * <p>Provides a mechanism to run one or more {@link Ext.data.Operation operations} in a given order. Fires the 'operationcomplete' event
 20 * after the completion of each Operation, and the 'complete' event when all Operations have been successfully executed. Fires an 'exception'
 21 * event if any of the Operations encounter an exception.</p>
 22 *
 23 * <p>Usually these are only used internally by {@link Ext.data.proxy.Proxy} classes</p>
 24 *
 25 */
 26Ext.define('Ext.data.Batch', {
 27    mixins: {
 28        observable: 'Ext.util.Observable'
 29    },
 30
 31    /**
 32     * @property {Boolean} autoStart
 33     * True to immediately start processing the batch as soon as it is constructed.
 34     */
 35    autoStart: false,
 36
 37    /**
 38     * @property {Number} current
 39     * The index of the current operation being executed
 40     */
 41    current: -1,
 42
 43    /**
 44     * @property {Number} total
 45     * The total number of operations in this batch. Read only
 46     */
 47    total: 0,
 48
 49    /**
 50     * @property {Boolean} isRunning
 51     * True if the batch is currently running
 52     */
 53    isRunning: false,
 54
 55    /**
 56     * @property {Boolean} isComplete
 57     * True if this batch has been executed completely
 58     */
 59    isComplete: false,
 60
 61    /**
 62     * @property {Boolean} hasException
 63     * True if this batch has encountered an exception. This is cleared at the start of each operation
 64     */
 65    hasException: false,
 66
 67    /**
 68     * @property {Boolean} pauseOnException
 69     * True to automatically pause the execution of the batch if any operation encounters an exception
 70     */
 71    pauseOnException: true,
 72
 73    /**
 74     * Creates new Batch object.
 75     * @param {Object} [config] Config object
 76     */
 77    constructor: function(config) {
 78        var me = this;
 79
 80        me.addEvents(
 81          /**
 82           * @event complete
 83           * Fired when all operations of this batch have been completed
 84           * @param {Ext.data.Batch} batch The batch object
 85           * @param {Object} operation The last operation that was executed
 86           */
 87          'complete',
 88
 89          /**
 90           * @event exception
 91           * Fired when a operation encountered an exception
 92           * @param {Ext.data.Batch} batch The batch object
 93           * @param {Object} operation The operation that encountered the exception
 94           */
 95          'exception',
 96
 97          /**
 98           * @event operationcomplete
 99           * Fired when each operation of the batch completes
100           * @param {Ext.data.Batch} batch The batch object
101           * @param {Object} operation The operation that just completed
102           */
103          'operationcomplete'
104        );
105
106        me.mixins.observable.constructor.call(me, config);
107
108        /**
109         * Ordered array of operations that will be executed by this batch
110         * @property {Ext.data.Operation[]} operations
111         */
112        me.operations = [];
113    },
114
115    /**
116     * Adds a new operation to this batch
117     * @param {Object} operation The {@link Ext.data.Operation Operation} object
118     */
119    add: function(operation) {
120        this.total++;
121
122        operation.setBatch(this);
123
124        this.operations.push(operation);
125    },
126
127    /**
128     * Kicks off the execution of the batch, continuing from the next operation if the previous
129     * operation encountered an exception, or if execution was paused
130     */
131    start: function() {
132        this.hasException = false;
133        this.isRunning = true;
134
135        this.runNextOperation();
136    },
137
138    /**
139     * @private
140     * Runs the next operation, relative to this.current.
141     */
142    runNextOperation: function() {
143        this.runOperation(this.current + 1);
144    },
145
146    /**
147     * Pauses execution of the batch, but does not cancel the current operation
148     */
149    pause: function() {
150        this.isRunning = false;
151    },
152
153    /**
154     * Executes a operation by its numeric index
155     * @param {Number} index The operation index to run
156     */
157    runOperation: function(index) {
158        var me = this,
159            operations = me.operations,
160            operation  = operations[index],
161            onProxyReturn;
162
163        if (operation === undefined) {
164            me.isRunning  = false;
165            me.isComplete = true;
166            me.fireEvent('complete', me, operations[operations.length - 1]);
167        } else {
168            me.current = index;
169
170            onProxyReturn = function(operation) {
171                var hasException = operation.hasException();
172
173                if (hasException) {
174                    me.hasException = true;
175                    me.fireEvent('exception', me, operation);
176                } else {
177                    me.fireEvent('operationcomplete', me, operation);
178                }
179
180                if (hasException && me.pauseOnException) {
181                    me.pause();
182                } else {
183                    operation.setCompleted();
184                    me.runNextOperation();
185                }
186            };
187
188            operation.setStarted();
189
190            me.proxy[operation.action](operation, onProxyReturn, me);
191        }
192    }
193});