5

我想要做的是捕获 302 错误,这意味着用户未登录,然后将该用户重定向到网站的登录页面。这是我现在的backbone.js同步覆盖:

parentSynchMethod = Backbone.sync
Backbone.sync = (method, model, success, error) -> 
  try
    parentSynchMethod.apply(Backbone, arguments)
  catch error
    window.location.replace("http://localhost:8080/login")

302 错误肯定会发生,当我使用谷歌浏览器检查页面时,我可以在网络视图中看到它。但是,当我设置断点时,它永远不会进入 catch 内部,并且错误参数是未定义的。这是因为 302 不是真正的错误(当我查看响应的状态时它是黄色的,而不是通常的红色错误,或者我在某处弄乱了代码。

4

1 回答 1

10

当 AJAX 请求返回错误条件(是的,302 是错误)时,默认Backbone.sync不会引发异常,它将错误处理留给$.ajax. 默认sync 如下所示

Backbone.sync = function(method, model, options) {
  // A bunch of bureaucratic setup and what not...

  // Make the request, allowing the user to override any Ajax options.
  return Backbone.ajax(_.extend(params, options));
};

并且Backbone.ajax只是$.ajax;注意以上是Backbone当前的master分支,当前发布的版本$.ajax直接使用。

你想要做的是用Backbone.sync总是强制错误处理程序的东西替换,如下所示:

error: (xhr, text_status, error_thrown) ->
    if(xhr.status == 302)
        window.location.replace('http://localhost:8080/login')
    else
        # call the supplied error handler if any

这样的事情应该可以解决问题:

parentSynchMethod = Backbone.sync
Backbone.sync = (method, model, options) ->
    old_error = options.error
    options.error = (xhr, text_status, error_thrown) ->
        if(xhr.status == 302)
            window.location.replace('http://localhost:8080/login')
        else
            old_error?(xhr, text_status, error_thrown)
    parentSyncMethod(method, model, options)

如果您正在使用 Backbone 的主分支(或Backbone.ajax在发布版本中阅读此内容),那么您可以替换Backbone.ajax为强制执行上述错误处理程序的内容,而不要Backbone.sync理会。

于 2012-04-19T22:51:48.360 回答