Javascript 如何在基于Backbone.js的应用程序中干净地获取401

Javascript 如何在基于Backbone.js的应用程序中干净地获取401,javascript,backbone.js,requirejs,amd,Javascript,Backbone.js,Requirejs,Amd,在我的基于Backbone.js的应用程序中,我正在与我的API交谈,如果底层请求是在没有或使用无效身份验证令牌的情况下发出的,该API将以401响应。每次收到401时,我都会导航到一个#登录页面,以实现这一点 为了获取401,我成功地包装了Backbone.sync,但在那一点上我有点卡住了。我在这里尝试了几种策略: 在主干网中抛出“unauthorized”并尝试在我的路由器中获取。失败,错误为:“未经授权” 尝试#。在主干::sync中向下导航“#登录”,这不仅看起来很奇怪,而且还带来了一

在我的基于Backbone.js的应用程序中,我正在与我的API交谈,如果底层请求是在没有或使用无效身份验证令牌的情况下发出的,该API将以401响应。每次收到401时,我都会导航到一个#登录页面,以实现这一点

为了获取401,我成功地包装了Backbone.sync,但在那一点上我有点卡住了。我在这里尝试了几种策略:

  • 在主干网中抛出“unauthorized”
    并尝试在我的路由器中获取。失败,错误为:“未经授权”

  • 尝试
    #。在主干::sync中向下导航“#登录”
    ,这不仅看起来很奇怪,而且还带来了一个问题,即我的应用程序基于AMD/require.js,我无法简单地访问我的主干。路由器实例在我包装的
    sync
    函数中向下

  • 到目前为止,我看到的唯一解决方案是创建一个“全局可用”缓存对象,该对象获取对我的路由器实例的引用,然后作为依赖项放入
    define
    中。那个缓存对象必须是一个单例对象,打破了我的“请不要全局变量,也不要名称空间”策略


    我被困在这里了。有人能给我指出一个更干净的解决这个常见问题的方法吗?

    您可以在ajaxError中执行重定向:

    $.ajaxError(function (event, xhr) {
                if (xhr.status == 401)
                    window.location = '#login';
            });
    

    如果所有设置都正确,则不需要手动访问路由器实例。转到该url应触发与其关联的路由函数。

    对于使用jQuery 1.8或更高版本的用户,语法已更改:

    $(document).ajaxError(function (event, xhr) {
            if (xhr.status == 401)
                window.location = '#login';
        });
    

    有关详细信息,请参阅。

    。我可以做同样的window.location=。。。在同步中获取响应。好主意。我想,为了获得一个干净的方法,我必须使用路由器。但这听起来是个好办法。谢谢你,Anrein,有人提到是从1.9开始的?