/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var App = require('app'); /** * Simple util for executing ajax-requests queue * * @uses App.ajax * @type {Em.Object} * * Don't add requests directly to queue! * Bad example: * * var q = App.ajax.Queue.create(); * q.get('queue').pushObject({...}); // Don't do this!!!! * * * Don't call runNextRequest directly! * Bad example: * * var q = App.ajax.Queue.create(); * q.runNextRequest(); // Don't do this!!!! * * * Usage example 1: * * var q = App.ajax.Queue.create(); * q.addRequest({ * name: 'some_request', * sender: this, * success: 'someFunc' * }).addRequest({ * name: 'some_request2', * sender: this, * success: 'someFunc2' * }).start(); * * * Usage example 2: * * var q = App.ajax.Queue.create(); * q.addRequest({ * name: 'some_request', * sender: this, * success: 'someFunc' * }); * q.addRequest({ * name: 'some_request2', * sender: this, * success: 'someFunc2' * }); * q.start(); * * * Usage example 3: * * var q = App.ajax.Queue.create(); * q.addRequests(Em.A([{ * name: 'some_request', * sender: this, * success: 'someFunc' * }, * { * name: 'some_request2', * sender: this, * success: 'someFunc2' * }])); * q.start(); * */ App.ajaxQueue = Em.Object.extend({ /** * List of requests * @type {Object[]} */ queue: Em.A([]), /** * About query executing if some request failed * @type {bool} */ abortOnError: true, /** * Function called after queue is complete * @type {callback} */ finishedCallback: Em.K, /** * Add request to the queue * @param {Object} request object that uses in App.ajax.send * @return {App.ajaxQueue} * @method addRequest */ addRequest: function(request) { Em.assert('Each ajax-request should has non-blank `name`', !Em.isBlank(Em.get(request, 'name'))); Em.assert('Each ajax-request should has object `sender`', Em.typeOf(Em.get(request, 'sender')) !== 'object'); this.get('queue').pushObject(request); return this; }, /** * Add requests to the queue * @param {Object[]} requests list of objects that uses in App.ajax.send * @return {App.ajaxQueue} * @method addRequests */ addRequests: function(requests) { requests.map(function(request) { this.addRequest(request); }, this); return this; }, /** * Enter point to start requests executing * @method start */ start: function() { this.runNextRequest(); }, /** * Execute first request from the queue * @method runNextRequest */ runNextRequest: function() { var self = this; var queue = this.get('queue'); if (queue.length === 0) { this.finishedCallback(); return; } var r = App.ajax.send(queue.shift()); this.propertyDidChange('queue'); if (r) { r.complete(function(xhr) { if(xhr.status>=200 && xhr.status <= 299) { self.runNextRequest(); } else { if (self.get('abortOnError')) { self.clear(); } else { self.runNextRequest(); } } }); } else { if (this.get('abortOnError')) { this.clear(); } else { this.runNextRequest(); } } }, /** * Remove all requests from queue * @method clear */ clear: function() { this.get('queue').clear(); } });