【发布时间】:2013-05-24 02:26:30
【问题描述】:
我有一个使用 Backbone.js 的应用程序,它有各种 AJAX 请求。我希望能够拦截所有 AJAX 请求并执行一些请求前和请求后功能,而不必在定义时指定这些功能。
我想要做的一个例子是,如果请求的响应表明用户未登录,则显示全屏模式。
我已经看过通过 jQuery 执行以下操作:
jQuery.ajaxSetup({
beforeSend: function() {
return console.log("mybefore");
}
});
但这似乎错过了使用套接字的 XHR 请求。
我还简要地研究过类似以下的操作:
XMLHttpRequest.prototype.reallySend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(body) {
console.log('mybefore');
this.reallySend(body);
};
对于这个例子,我不知道怎么做after
毕竟,我的问题是:是否有一种优雅的方法可以覆盖 ajax 函数来进行预处理和后处理,而不会改变发出请求的方式。
(任何backbone.js 特定的解决方案也很好)
【问题讨论】:
-
对于骨干网,您将覆盖
Backbone.sync。对于 jQuery,你已经想通了。绕过两者并直接处理XMLHttpRequest......你想要这个劫持做什么?只是为了登录?还是修改东西? -
不仅仅是日志。不一定要对原始请求进行更改(尽管这可能是一个选项),它会在请求之前和之后执行更多操作。
-
为什么不能使用
jQuery或Backbone来创建请求,而不是直接创建XMLHttpRequest?对于任何看到代码的人来说,您可以直接修改该行为(通过重写原型)所做的任何事情都可能是一种丑陋的黑客行为(我个人认为上述reallySend方法是一种黑客行为)。如果您真的不能使用jQuery,也许您可以将XMLHttpRequest包装在一些本地定义的CustomXMLHttpRequest中? -
是的,我确实认为 realSend 也是一个 hack!我试图实现一个不可知的方法来完成这个。我正在使用的应用程序是使用 jQuery 和 XHR 调用的 Backbone 实现的混合构建的。所以我的想法是它们都以 XMLHttpRequest.prototype.send 结尾......对吗? (也许不是这样:))
-
这是一个实现细节。也许他们都打电话给
send,但即便如此,你能保证他们不会(也永远不会)覆盖发送方法吗?由于您无法控制这些库,因此您只能说出您正在使用的当前版本是做什么的。只要有可能,您就应该按预期使用 API。即使实施发生变化以使用新方法来加快速度或修复一些错误,它们也可能保持不变。
标签: javascript ajax backbone.js