// Extension to Ajax allowing for classes of requests of which only one (the latest) is ever active at a time // - stops queues of now-redundant requests building up / allows you to supercede one request with another easily. // just pass in onlyLatestOfClass: 'classname' in the options of the request Ajax.currentRequests = {}; Ajax.Responders.register({ onCreate: function(request) { if (request.options.onlyLatestOfClass && Ajax.currentRequests[request.options.onlyLatestOfClass]) { // if a request of this class is already in progress, attempt to abort it before launching this new request try { Ajax.currentRequests[request.options.onlyLatestOfClass].transport.abort(); } catch(e) {} } // keep note of this request object so we can cancel it if superceded Ajax.currentRequests[request.options.onlyLatestOfClass] = request; }, onComplete: function(request) { if (request.options.onlyLatestOfClass) { // remove the request from our cache once completed so it can be garbage collected Ajax.currentRequests[request.options.onlyLatestOfClass] = null; } } });
You need to create an account or log in to post comments to this site.
I've tried this variation that will cancel queued requests, but it seems to only cancel copies and the actual requests remain. (firebug required)
What I am doing is finding all requests with cancelableRequest in the options, making the value for cancelableRequest the time in milliseconds for identification later, then adding it to a array.
On complete I am then looking through that array for a matching cancelableRequest value and removing it from the array.
I have a function that I call that loops through the array and calls abort on each request. When I run this code I get my canceled log messages for a request followed by a completed message which should never happen if it was really canceled.