我需要捕捉來自服務器的所有響應中可能的登錄頁面,所以我已全局覆蓋Backbone.sync,以便在傳遞它們之前檢查所有錯誤。捕捉骨幹同步錯誤
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);
};
當從0.9.9變爲1.0時,這個數字變得非常糟糕。看起來像原來的Backbone.sync以不同的方式包裝它的錯誤處理程序,導致我的錯誤處理程序首先被調用,並帶有jquery xhr簽名。 我只好錯誤處理程序的簽名改成這樣:
options.error = function (xhr, statusTxt, thrown) {
確定,所以現在它的工作原理,但我得到,我做錯了什麼的感覺。
有沒有更好的方法來做到這一點?
我試過jQuery的承諾,但我需要能夠從錯誤狀態切換到成功(當調用originalSuccess時),這似乎沒有與承諾一起工作。
你可以顯示你的jQuery嘗試?這聽起來很有希望[原文如此]。 – 2013-05-10 10:50:47