Questo snippet di codice ha funzionato in 1.7.2 con callback sia di successo che di errore e promette callback di stile. Con 1.8.2 i callback di successo/errore continuano a funzionare ma le promesse no. La mia impressione è che la linea return dfd.promise(jqXHR);
sia il problema, ma non sono certa.Le mie promesse non funzionano più in jQuery 1.8
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
// Don't infinitely recurse
originalOptions._retry = isNaN(originalOptions._retry)
? Common.auth.maxExpiredAuthorizationRetries
: originalOptions._retry - 1;
// set up to date authorization header with every request
jqXHR.setRequestHeader("Authorization", Common.auth.getAuthorizationHeader());
// save the original error callback for later
if (originalOptions.error)
originalOptions._error = originalOptions.error;
// overwrite *current request* error callback
options.error = $.noop();
// setup our own deferred object to also support promises that are only invoked
// once all of the retry attempts have been exhausted
var dfd = $.Deferred();
jqXHR.done(dfd.resolve);
// if the request fails, do something else yet still resolve
jqXHR.fail(function() {
var args = Array.prototype.slice.call(arguments);
if (jqXHR.status === 401 && originalOptions._retry > 0) {
// refresh the oauth credentials for the next attempt(s)
// (will be stored and returned by Common.auth.getAuthorizationHeader())
Common.auth.handleUnauthorized();
// retry with our modified
$.ajax(originalOptions).then(dfd.resolve, dfd.reject);
} else {
// add our _error callback to our promise object
if (originalOptions._error)
dfd.fail(originalOptions._error);
dfd.rejectWith(jqXHR, args);
}
});
// NOW override the jqXHR's promise functions with our deferred
return dfd.promise(jqXHR);
});
Aggiornamento: Ecco la mia richiesta AJAX che non riesce:
$.ajax({
url: someFunctionToGetUrl(),
// works
//success: callback,
//error: ajaxErrorHandler
}).then(
[callback],
[errorback, ajaxErrorHandler]
);
};
Le richieste sono sincrone? Se è così, non funzionerà con 'jqXHR'. Da docs: "A partire da jQuery 1.8, l'uso di async: false con jqXHR ($ .Deferred) è deprecato, è necessario utilizzare le callback complete/success/error." – bfavaretto
No, ho aggiunto la mia richiesta Ajax nel post – ryan
Hai familiarità con il debugger di Chrome? >. < Il tuo post può ricevere risposta da persone che: 1 hanno la stessa cosa (o fanno la ricerca). 2 avere la pazienza e la volontà di impostare un esempio per indagare.Quindi se fornissi una risposta sarebbe utile. – EricG