Potrzebowałem złapać możliwą stronę logowania we wszystkich odpowiedziach od serwera, więc przesłoniłem Backbone.sync globalnie, więc mogę sprawdzić wszystkie błędy przed ich przekazaniem.Łapanie błędów synchronizacji kręgosłupa
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);
};
To zepsuło się, przechodząc od 0.9.9 do 1.0. Wygląda na to, że oryginalny Backbone.sync inaczej obchodzi obsługę błędów, powodując, że mój program obsługi błędów jest wywoływany jako pierwszy, z sygnaturą jQuery xhr. musiałem zmienić podpis obsługi błędów do tego:
options.error = function (xhr, statusTxt, thrown) {
Ok, więc teraz to działa, ale mam wrażenie, że robię coś złego.
Czy jest lepszy sposób to zrobić?
Próbowałem z jquery obietnic, ale muszę być w stanie przejść od stanu błędu do sukcesu (podczas wywoływania originalSuccess), który nie wydaje się działać z obietnicami.
Czy możesz pokazać swoją próbę jQuery? Brzmi obiecująco [sic]. –