pra*_*n64 5 redirect sync http-status-code-302 coffeescript backbone.js
我想要做的是捕获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")
Run Code Online (Sandbox Code Playgroud)
302肯定会发生错误,当我使用谷歌浏览器检查页面时,我可以在网络视图中看到它.但是,当我设置断点时,它永远不会进入catch,并且error参数未定义.这是因为302不是真正的错误(当我查看响应的状态时它是黄色的,而不是通常的红色表示错误,或者我在某处弄乱了代码.
mu *_*ort 10
Backbone.sync当AJAX请求返回错误条件时(默认情况下,302是错误),默认不会引发异常,它会将错误处理留给$.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));
};
Run Code Online (Sandbox Code Playgroud)
而且Backbone.ajax只是$.ajax; 请注意,以上是Backbone的当前主分支,目前发布的版本$.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
Run Code Online (Sandbox Code Playgroud)
像这样的东西应该做的伎俩:
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)
Run Code Online (Sandbox Code Playgroud)
如果你正在使用Backbone的主分支(或者Backbone.ajax在发布版本之后阅读它),那么你可以用Backbone.ajax强制上面的错误处理程序的东西替换而不Backbone.sync管它.
| 归档时间: |
|
| 查看次数: |
3757 次 |
| 最近记录: |