Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
queued ajax requests with a queueMaxConcurrency option that can be set on each request
$ = jQuery
queues = {}
queue = (name) ->
name = 'default' if name is true
queues[name] or= {entries: [], running: 0}
next = (name, done) ->
list = queue(name)
if done
queue(name).running--
unless list.entries.length
return
[options, deferred] = list.entries[0]
if list.running >= (options.queueMaxConcurrency || 1)
return
list.entries.shift()
queue(name).running++
$.ajax(options)
.always(-> next(name, true))
.done(-> deferred.resolve(arguments...))
.fail(-> deferred.reject(arguments...))
push = (name, options) ->
list = queue(name)
deferred = $.Deferred()
list.entries.push([options, deferred])
next(name)
deferred.promise()
remove = (name, options) ->
list = queue(name)
for [value, _], i in list.entries when value is options
list.entries.splice(i, 1)
break
$.ajaxTransport '+*', (options) ->
if options.queue
queuedOptions = $.extend({}, options)
queuedOptions.queue = false
queuedOptions.processData = false
send: (headers, complete) ->
push(options.queue, queuedOptions)
.done (data, textStatus, jqXHR) ->
complete(jqXHR.status,
jqXHR.statusText,
text: jqXHR.responseText,
jqXHR.getAllResponseHeaders())
.fail (jqXHR, textStatus, errorThrown) ->
complete(jqXHR.status,
jqXHR.statusText,
text: jqXHR.responseText,
jqXHR.getAllResponseHeaders())
abort: ->
remove(options.queue, queuedOptions)
// Generated by CoffeeScript 1.6.2
(function() {
var $, next, push, queue, queues, remove, running;
$ = jQuery;
queues = {};
running = false;
queue = function(name) {
if (name === true) {
name = 'default';
}
return queues[name] || (queues[name] = []);
};
next = function(name) {
var deferred, list, options, _ref;
list = queue(name);
if (!list.length) {
running = false;
return;
}
_ref = list.shift(), options = _ref[0], deferred = _ref[1];
return $.ajax(options).always(function() {
return next(name);
}).done(function() {
return deferred.resolve.apply(deferred, arguments);
}).fail(function() {
return deferred.reject.apply(deferred, arguments);
});
};
push = function(name, options) {
var deferred, list;
list = queue(name);
deferred = $.Deferred();
list.push([options, deferred]);
if (!running) {
next(name);
}
running = true;
return deferred.promise();
};
remove = function(name, options) {
var i, list, value, _, _i, _len, _ref, _results;
list = queue(name);
_results = [];
for (i = _i = 0, _len = list.length; _i < _len; i = ++_i) {
_ref = list[i], value = _ref[0], _ = _ref[1];
if (!(value === options)) {
continue;
}
list.splice(i, 1);
break;
}
return _results;
};
$.ajaxTransport('+*', function(options) {
var queuedOptions;
if (options.queue) {
queuedOptions = $.extend({}, options);
queuedOptions.queue = false;
queuedOptions.processData = false;
return {
send: function(headers, complete) {
return push(options.queue, queuedOptions).done(function(data, textStatus, jqXHR) {
return complete(jqXHR.status, jqXHR.statusText, {
text: jqXHR.responseText
}, jqXHR.getAllResponseHeaders());
}).fail(function(jqXHR, textStatus, errorThrown) {
return complete(jqXHR.status, jqXHR.statusText, {
text: jqXHR.responseText
}, jqXHR.getAllResponseHeaders());
});
},
abort: function() {
return remove(options.queue, queuedOptions);
}
};
}
});
}).call(this);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment