-
-
Save tobiashm/0a987db2f9ec8e5cdbb3 to your computer and use it in GitHub Desktop.
| function AjaxError(jqXHR, textStatus, errorThrown) { | |
| this.name = "AjaxError"; | |
| this.message = textStatus; | |
| this.jqXHR = jqXHR; | |
| this.errorThrown = errorThrown; | |
| } | |
| AjaxError.prototype = new Error(); | |
| AjaxError.prototype.constructor = AjaxError; | |
| (function($) { | |
| function decorateAsJQuery(promise) { | |
| promise.done = function(fn) { | |
| return decorateAsJQuery(promise.then(fn)); | |
| }; | |
| promise.fail = function(fn) { | |
| return decorateAsJQuery(promise.then(null, fn)); | |
| }; | |
| promise.complete = function(fn) { | |
| return decorateAsJQuery(promise.then(fn, fn)); | |
| }; | |
| return promise; | |
| } | |
| var jqAjax = $.ajax; | |
| $.ajax = function ajax() { | |
| var args = Array.prototype.slice.call(arguments); | |
| var jqPromise = jqAjax.apply(this, args); | |
| var promise = new Promise(function(resolve, reject) { | |
| jqPromise.then(function(data, textStatus, jqXHR) { | |
| resolve(data); | |
| }, function(jqXHR, textStatus, errorThrown) { | |
| reject(new AjaxError(jqXHR, textStatus, errorThrown)); | |
| }); | |
| }); | |
| return decorateAsJQuery(promise); | |
| }; | |
| })(jQuery); |
To the best of my knowledge, jQuery's deferred object aren't Promise/A+ compliant. In particular, they don't catch errors in reactions.
You can find numerous blog posts on the subject that will explain the the subtle differences. For instance, I suggest you have a look at JavaScript Promises, by Jake Archibald
jqXHR is a superset of the browser's native XMLHttpRequest object.
Such as: abort current request
var jqXHR = $.ajax(...)
jqXHR.abort()Is this free software and if yes, would you mind explicitly putting a license on top? I would very much like to reuse it in a project.
This breaks the jQuery AJAX load-function ($(element).load(someURL)), since jQuery 2.2.0 and 3.0.0 (see jquery/jquery@97ef1f2), as the .always() function is used instead of the deprecated .complete().
This can be fixed by adding the line promise.always = promise.complete; between lines 20 and 21.
Also, the reason why you would use this is to be able to use .catch() on a chain of promises, so that you can have a single error handler if any one call in a series of AJAX calls fail.
What are the advantages of doing this over using the simple http://api.jquery.com/category/deferred-object/?