1 2 3 4 5 6(function($) { 7 8 var queues = {}; 9 var activeReqs = {}; 10 11 12 13 $.ajaxq = function(qname, opts) { 14 15 if (typeof opts === "undefined") { 16 throw ("AjaxQ: queue name is not provided"); 17 } 18 19 20 var deferred = $.Deferred(), 21 promise = deferred.promise(); 22 23 promise.success = promise.done; 24 promise.error = promise.fail; 25 promise.complete = promise.always; 26 27 28 var deferredOpts = typeof opts === 'function'; 29 30 var clonedOptions = !deferredOpts ? $.extend(true, {}, opts) : null; 31 enqueue(function() { 32 33 var jqXHR = $.ajax.apply(window, [deferredOpts ? opts() : clonedOptions]); 34 35 36 37 jqXHR.done(function() { 38 deferred.resolve.apply(this, arguments); 39 }); 40 jqXHR.fail(function() { 41 deferred.reject.apply(this, arguments); 42 }); 43 44 jqXHR.always(dequeue); 45 return jqXHR; 46 }); 47 48 return promise; 49 50 51 52 53 function enqueue(cb) { 54 if (!queues[qname]) { 55 queues[qname] = []; 56 var xhr = cb(); 57 activeReqs[qname] = xhr; 58 } 59 else { 60 queues[qname].push(cb); 61 } 62 } 63 64 65 66 function dequeue() { 67 if (!queues[qname]) { 68 return; 69 } 70 var nextCallback = queues[qname].shift(); 71 if (nextCallback) { 72 var xhr = nextCallback(); 73 activeReqs[qname] = xhr; 74 } 75 else { 76 delete queues[qname]; 77 delete activeReqs[qname]; 78 } 79 } 80 }; 81 82 83 84 $.each( [ "getq", "postq" ], function( i, method ) { 85 $[ method ] = function( qname, url, data, callback, type ) { 86 87 if ( $.isFunction( data ) ) { 88 type = type || callback; 89 callback = data; 90 data = undefined; 91 } 92 93 return $.ajaxq(qname, { 94 type: method === "postq" ? "post" : "get", 95 url: url, 96 data: data, 97 success: callback, 98 dataType: type 99 }); 100 }; 101 }); 102 103 var isQueueRunning = function(qname) { 104 return queues.hasOwnProperty(qname) && queues[qname].length > 0; 105 }; 106 107 var isAnyQueueRunning = function() { 108 for (var i in queues) { 109 if (isQueueRunning(i)) return true; 110 } 111 return false; 112 }; 113 114 $.ajaxq.isRunning = function(qname) { 115 if (qname) return isQueueRunning(qname); 116 else return isAnyQueueRunning(); 117 }; 118 119 $.ajaxq.getActiveRequest = function(qname) { 120 if (!qname) throw ("AjaxQ: queue name is required"); 121 122 return activeReqs[qname]; 123 }; 124 125 $.ajaxq.abort = function(qname) { 126 if (!qname) throw ("AjaxQ: queue name is required"); 127 128 var current = $.ajaxq.getActiveRequest(qname); 129 delete queues[qname]; 130 delete activeReqs[qname]; 131 if (current) current.abort(); 132 }; 133 134 $.ajaxq.clear = function(qname) { 135 if (!qname) { 136 for (var i in queues) { 137 if (queues.hasOwnProperty(i)) { 138 queues[i] = []; 139 } 140 } 141 } 142 else { 143 if (queues[qname]) { 144 queues[qname] = []; 145 } 146 } 147 }; 148 149})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.