Last active

Embed URL

HTTPS clone URL

SSH clone URL

You can clone with HTTPS or SSH.

Download Gist

Queueing jQuery Ajax requests. Usage $.ajax({queue: true})

View jquery.ajax.queue.coffee
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
$ = jQuery
 
queues = {}
running = false
 
queue = (name) ->
name = 'default' if name is true
queues[name] or= []
 
next = (name) ->
list = queue(name)
 
unless list.length
running = false
return
 
[options, deferred] = list.shift()
 
$.ajax(options)
.always(-> next(name))
.done(-> deferred.resolve(arguments...))
.fail(-> deferred.reject(arguments...))
 
push = (name, options) ->
list = queue(name)
deferred = $.Deferred()
 
list.push([options, deferred])
next(name) unless running
running = true
deferred.promise()
 
remove = (name, options) ->
list = queue(name)
 
for [value, _], i in list when value is options
list.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)
infacq commented

How do I use this in Backbone + Requirejs?

I'm wondering why "running" is shared between all the queues. Seems like if you submitted a request to one queue while another queue was active, then you'd never actually run that request, since the completion of a request on a different queue will not, as far as I can see, send any requests from a different queue. To do that, you'd need some sort of global queue or an arbiter of some sort.

I've forked this gist to store the number of running jobs per queue and also to allow a specified number of concurrent requests. It doesn't attempt to manage a global limit on the number of requests. See my changes at:

https://gist.github.com/dontfidget/1ad9ab33971b64fe6fef

Thanks for sharing this code.

This is firing my ajax requests twice now. Any ones that I add {queue:true} to now, get fired twice?? Why would this be?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.