Queuing ajax queries might sometimes be useful. Here is a coffeescript version based on $.Deferred objects.
Working sample can be found here: http://jsfiddle.net/wA6K8/1/
Queuing ajax queries might sometimes be useful. Here is a coffeescript version based on $.Deferred objects.
Working sample can be found here: http://jsfiddle.net/wA6K8/1/
| ###* | |
| * jQuery queue plugin v0.1 | |
| * ========================== | |
| * | |
| * Used to queue $.Deferred's Promise objects | |
| * author @_dhar | |
| ### | |
| (($) -> | |
| class $.Queueable | |
| constructor: (@builder, @args, @validator = -> yes) -> | |
| promise: -> @builder(@args...).promise() | |
| expose: -> @args | |
| isValid: -> @validator(@args...) | |
| $.queuedWhen = (queueables) -> | |
| d = $.Deferred(); | |
| prev = null | |
| deferredObjs = (( | |
| do (q) -> | |
| if not q instanceof $.Queueable | |
| d.reject "#{q} is not a $.Queueable object", q | |
| else | |
| prev = if prev then prev.pipe -> q.promise() else q.promise() | |
| prev.done -> d.notify q.expose() | |
| prev.fail -> d.reject q.expose() | |
| ) for q in queueables when q.isValid() ) | |
| $.when(deferredObjs...).then -> d.resolve() | |
| return d.promise() | |
| )(jQuery) |
| ### | |
| * Sample 1: Create $.Queueable objects with custom builder, args and validator | |
| ### | |
| queueables1 = [ | |
| new $.Queueable $.get, ['/echo/json/', {arg:'1', delay:1}] | |
| new $.Queueable $.get, ['/echo/json/', {arg:'2', delay:1}] | |
| new $.Queueable $.get, ['/echo/json/', {arg:'3', delay:1}] | |
| ] | |
| $.queuedWhen(queueables1).then -> console.log 'all done' |
| ### | |
| * Sample 2: Create $.Queueable objects with custom builder, args and validator | |
| ### | |
| doQuery = (url, arg) -> $.get(url, {arg: arg, delay: 1}) | |
| check = (url, arg, doIt) -> doIt | |
| queueables2 = [ | |
| new $.Queueable doQuery, ['/echo/json/', '1', yes ], check | |
| new $.Queueable doQuery, ['/echo/json/', '2', yes ], check | |
| new $.Queueable doQuery, ['/echo/json/', '3', yes ], check | |
| new $.Queueable doQuery, ['/echo/json/', '4', no ], check # this one won't be sent | |
| new $.Queueable doQuery, ['/echo/fail/', '5', yes ], check # this one will fail | |
| new $.Queueable doQuery, ['/echo/json/', '6', yes ], check | |
| ] | |
| $.queuedWhen(queueables2).done(-> console.log 'all done').fail (q) -> | |
| console.log 'something goes wrong...', q |
| ### | |
| * Sample 3: Create a custom $.Queueable object and override methods | |
| ### | |
| class TestQueueable extends $.Queueable | |
| constructor: (@id) -> | |
| promise: -> $.post '/echo/json/', {id: @id, delay:1} | |
| expose: -> @id | |
| isValid: -> @id%2 is 0 | |
| someOtherMethod: -> console.log "someOtherMethod called on TestQueueable[#{@id}]" | |
| queueables3 = [ | |
| new TestQueueable 1 | |
| new TestQueueable 2 | |
| new TestQueueable 3 | |
| new TestQueueable 4 | |
| new TestQueueable 5 | |
| new TestQueueable 6 | |
| new TestQueueable 7 | |
| ] | |
| $.queuedWhen(queueables3).done -> console.log "all done" |