| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-data-Batch'>/**</span> * @author Ed Spencer * @class Ext.data.Batch * * <p>Provides a mechanism to run one or more {@link Ext.data.Operation operations} in a given order. Fires the 'operationcomplete' event * after the completion of each Operation, and the 'complete' event when all Operations have been successfully executed. Fires an 'exception' * event if any of the Operations encounter an exception.</p> * * <p>Usually these are only used internally by {@link Ext.data.proxy.Proxy} classes</p> * */Ext.define('Ext.data.Batch', {    mixins: {        observable: 'Ext.util.Observable'    },<span id='Ext-data-Batch-cfg-autoStart'>    /**</span>     * @cfg {Boolean} autoStart     * True to immediately start processing the batch as soon as it is constructed (defaults to false)     */    autoStart: false,    <span id='Ext-data-Batch-cfg-pauseOnException'>    /**</span>     * @cfg {Boolean} pauseOnException     * True to pause the execution of the batch if any operation encounters an exception     * (defaults to false). If you set this to true you are responsible for implementing the appropriate     * handling logic and restarting or discarding the batch as needed. There are different ways you could      * do this, e.g. by handling the batch's {@link #exception} event directly, or perhaps by overriding     * {@link Ext.data.AbstractStore#onBatchException onBatchException} at the store level. If you do pause     * and attempt to handle the exception you can call {@link #retry} to process the same operation again.      *      * Note that {@link Ext.data.Operation operations} are atomic, so any operations that may have succeeded     * prior to an exception (and up until pausing the batch) will be finalized at the server level and will     * not be automatically reversible. Any transactional / rollback behavior that might be desired would have     * to be implemented at the application level. Pausing on exception will likely be most beneficial when     * used in coordination with such a scheme, where an exception might actually affect subsequent operations     * in the same batch and so should be handled before continuing with the next operation.     *      * If you have not implemented transactional operation handling then this option should typically be left      * to the default of false (e.g. process as many operations as possible, and handle any exceptions      * asynchronously without holding up the rest of the batch).     */    pauseOnException: false,<span id='Ext-data-Batch-property-current'>    /**</span>     * @property {Number} current     * The index of the current operation being executed. Read only     */    current: -1,<span id='Ext-data-Batch-property-total'>    /**</span>     * @property {Number} total     * The total number of operations in this batch. Read only     */    total: 0,<span id='Ext-data-Batch-property-isRunning'>    /**</span>     * @property {Boolean} isRunning     * True if the batch is currently running. Read only     */    isRunning: false,<span id='Ext-data-Batch-property-isComplete'>    /**</span>     * @property {Boolean} isComplete     * True if this batch has been executed completely. Read only     */    isComplete: false,<span id='Ext-data-Batch-property-hasException'>    /**</span>     * @property {Boolean} hasException     * True if this batch has encountered an exception. This is cleared at the start of each operation. Read only     */    hasException: false,<span id='Ext-data-Batch-method-constructor'>    /**</span>     * Creates new Batch object.     * @param {Object} [config] Config object     */    constructor: function(config) {        var me = this;<span id='Ext-data-Batch-event-complete'>        /**</span>         * @event complete         * Fired when all operations of this batch have been completed         * @param {Ext.data.Batch} batch The batch object         * @param {Object} operation The last operation that was executed         */<span id='Ext-data-Batch-event-exception'>        /**</span>         * @event exception         * Fired when a operation encountered an exception         * @param {Ext.data.Batch} batch The batch object         * @param {Object} operation The operation that encountered the exception         */<span id='Ext-data-Batch-event-operationcomplete'>        /**</span>         * @event operationcomplete         * Fired when each operation of the batch completes         * @param {Ext.data.Batch} batch The batch object         * @param {Object} operation The operation that just completed         */        me.mixins.observable.constructor.call(me, config);<span id='Ext-data-Batch-property-operations'>        /**</span>         * Ordered array of operations that will be executed by this batch         * @property {Ext.data.Operation[]} operations         */        me.operations = [];        <span id='Ext-data-Batch-property-exceptions'>        /**</span>         * Ordered array of operations that raised an exception during the most recent         * batch execution and did not successfully complete         * @property {Ext.data.Operation[]} exceptions         */        me.exceptions = [];    },<span id='Ext-data-Batch-method-add'>    /**</span>     * Adds a new operation to this batch at the end of the {@link #operations} array     * @param {Object} operation The {@link Ext.data.Operation Operation} object     * @return {Ext.data.Batch} this     */    add: function(operation) {        this.total++;        operation.setBatch(this);        this.operations.push(operation);                return this;    },<span id='Ext-data-Batch-method-start'>    /**</span>     * Kicks off execution of the batch, continuing from the next operation if the previous     * operation encountered an exception, or if execution was paused. Use this method to start     * the batch for the first time or to restart a paused batch by skipping the current     * unsuccessful operation.     *      * To retry processing the current operation before continuing to the rest of the batch (e.g.     * because you explicitly handled the operation's exception), call {@link #retry} instead.     *      * Note that if the batch is already running any call to start will be ignored.     *      * @return {Ext.data.Batch} this     */    start: function(/* private */ index) {        var me = this;                if (me.isRunning) {            return me;        }                me.exceptions.length = 0;        me.hasException = false;        me.isRunning = true;        return me.runOperation(Ext.isDefined(index) ? index : me.current + 1);    },    <span id='Ext-data-Batch-method-retry'>    /**</span>     * Kicks off execution of the batch, continuing from the current operation. This is intended     * for restarting a {@link #pause paused} batch after an exception, and the operation that raised     * the exception will now be retried. The batch will then continue with its normal processing until     * all operations are complete or another exception is encountered.     *      * Note that if the batch is already running any call to retry will be ignored.     *      * @return {Ext.data.Batch} this     */    retry: function() {        return this.start(this.current);    },<span id='Ext-data-Batch-method-runNextOperation'>    /**</span>     * @private     * Runs the next operation, relative to this.current.     * @return {Ext.data.Batch} this     */    runNextOperation: function() {        return this.runOperation(this.current + 1);    },<span id='Ext-data-Batch-method-pause'>    /**</span>     * Pauses execution of the batch, but does not cancel the current operation     * @return {Ext.data.Batch} this     */    pause: function() {        this.isRunning = false;        return this;    },<span id='Ext-data-Batch-method-runOperation'>    /**</span>     * Executes an operation by its numeric index in the {@link #operations} array     * @param {Number} index The operation index to run     * @return {Ext.data.Batch} this     */    runOperation: function(index) {        var me = this,            operations = me.operations,            operation = operations[index],            onProxyReturn;        if (operation === undefined) {            me.isRunning = false;            me.isComplete = true;            me.fireEvent('complete', me, operations[operations.length - 1]);        } else {            me.current = index;            onProxyReturn = function(operation) {                var hasException = operation.hasException();                if (hasException) {                    me.hasException = true;                    me.exceptions.push(operation);                    me.fireEvent('exception', me, operation);                }                if (hasException && me.pauseOnException) {                    me.pause();                } else {                    operation.setCompleted();                    me.fireEvent('operationcomplete', me, operation);                    me.runNextOperation();                }            };            operation.setStarted();            me.proxy[operation.action](operation, onProxyReturn, me);        }                return me;    }});</pre></body></html>
 |