Avevo bisogno di catturare una possibile pagina di accesso in tutte le risposte dal server, quindi ho sovrascritto Backbone.sync a livello globale in modo da poter controllare tutti gli errori prima di passarli.Errori di sincronizzazione Backbone
Backbone.originalSync = Backbone.sync;
Backbone.sync = function (method, model, options) {
var originalSuccess, originalError;
console.log("sync override...");
// remember original success so we can call it if user logs in successfully
originalSuccess = options.success;
// proxy the error callback to first check if we get a login page back
originalError = options.error;
options.error = function (model, xhr, options) {
if (xhr.status === 200 && xhr.responseText === "") {
// parse error from empty response (jq1.9 invalid json, ok)
originalSuccess(model, xhr, options);
} else {
console.log("Sync error " + statusTxt + ", " + thrown.message);
if (xhr.status === 200 || xhr.status === 302 || xhr.status === 0) {
// login page returned instead of json...
// open a new window with relogon.html to trigger a new login
window.showModalDialog("../relogon.html");
} else {
// normal error, pass along
if (originalError) {
originalError(model, xhr, options);
}
}
}
};
// call the original sync
Backbone.originalSync(method, model, options);
};
Questo si è rotto miseramente passando da 0.9.9 a 1.0. Sembra che l'originale Backbone.sync avvolga in modo diverso i suoi gestori di errori, facendo in modo che il mio gestore di errori venga chiamato per primo, con una firma jquery xhr. Ho dovuto cambiare la firma del gestore degli errori a questo:
options.error = function (xhr, statusTxt, thrown) {
Ok, quindi ora funziona, ma ho la sensazione che sto facendo qualcosa di sbagliato.
C'è un modo migliore per farlo?
Ho provato con jquery promises, ma ho bisogno di essere in grado di passare dallo stato di errore al successo (quando si chiama originalSuccess), che non sembra funzionare con le promesse.
Puoi mostrare il tuo tentativo di jQuery? Sembra promettente [sic]. –