在我们的项目中,我们使用主干来访问 REST 服务。
此服务提供一个 HTTP 标头,其中包含一种会话令牌以对当前用户进行身份验证。
这个令牌在每个请求上都会改变。
我们将此令牌与我们的登录模型一起使用来确定当前路由是否需要登录。
第一个想法是使用 jQuery.ajaxSuccess。
$(document).ajaxSuccess(function(event, xhr, settings) {
updateToken(xhr);
});
几乎可以工作,但是在主干中的成功处理程序之后触发了全局成功。
因此,如果任何主干成功处理程序向服务器发起新请求,此时它有一个旧令牌,该请求将被拒绝。
在每个成功处理程序中调用 updateToken 或使用 setTimeout 继续处理是非常费力且容易出错的。它可能会被遗忘。
现在我们创建了这个解决方案
var BBsync = Backbone.sync;
Backbone.sync = function(method, model, options) {
var success = options.success;
options.success = function(model, response, options) {
updateToken(options);
success(model, response, options);
};
return BBsync.call(this, method, model, options);
};
所有成功方法都被包装了。
这个解决方案有风险吗?
我们是否忽略了什么?
有更好的解决方案吗?