backbone.js - 捕获主干同步错误

标签 backbone.js jquery-deferred

我需要在来自服务器的所有响应中捕获一个可能的登录页面,所以我全局覆盖了 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 promise ,但我需要能够从错误状态切换到成功(调用 originalSuccess 时),这似乎不适用于 promise 。

最佳答案

所有同步错误都传递给模型的 error事件,因此您可以收听此事件。

来自 http://backbonejs.org/#Events-catalog :

"error" (model, xhr, options) — when a model's save call fails on the server.



要全局捕获错误,您可以使用 http://api.jquery.com/ajaxError/

关于backbone.js - 捕获主干同步错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16476874/

相关文章:

javascript - 如何在 x 时间后无响应时取消 ajax 请求或第三方 js 请求 w/abort()

javascript - 点击 Google map 标记时添加信息窗口气泡

backbone.js - 主干多路由器陷阱 - 子路由器处理程序未调用

backbone.js - 如何遍历 Backbone 集合的范围?

backbone.js - 如何从一个获取请求获取多个模型或集合

javascript - 使用 jQuery Deferred 链接 AJAX 处理程序

javascript - 将模型添加到 Marionette ItemView 定义之外的主干集合

javascript - "unresolving"延迟对象

使用 $.when 时 jQuery 进度重复调用

javascript - 异步 JavaScript - 回调与延迟/ promise