Backbone.js 拦截 AJAX 请求

4
我有一个使用Backbone.js的应用程序,其中包含各种AJAX请求。我希望能够拦截所有AJAX请求,并在不必在定义点指定这些函数的情况下执行一些预处理和后处理函数。
我想要做的事情的一个例子是,如果请求的响应表明用户未登录,则显示全屏模态框。
我已经尝试使用jQuery进行以下操作:
jQuery.ajaxSetup({
  beforeSend: function() {
     return console.log("mybefore");
  }
});

但是这种方式似乎无法捕捉使用sockets的XHR请求。

我也简要地研究了以下类似的做法:

XMLHttpRequest.prototype.reallySend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(body) {
    console.log('mybefore');
    this.reallySend(body);
};

在这个例子中,我不确定该如何处理after

所以经过所有这些,我的问题是:是否有一种优雅的方式可以覆盖ajax函数来进行预处理和后处理,而不改变请求的方式。

(任何关于backbone.js的特定解决方案也将很好)


2
对于 Backbone,您需要覆盖 Backbone.sync。对于 jQuery,您已经弄清楚了。要绕过这两个并直接处理 XMLHttpRequest... 您想让这种劫持做什么?只是记录吗?还是修改一些东西? - Shadow Man
不仅仅是日志记录。不一定要对原始请求进行更改(尽管这可能是一个选项),而是在请求之前和之后执行操作。 - neolaser
为什么直接使用 XMLHttpRequest 而不是使用 jQueryBackbone 来创建请求?任何你通过覆盖原型来修改行为的尝试都很可能会被看作是一种丑陋的 hack(个人认为上面的 reallySend 方法就是 hack)。如果实在不能使用 jQuery,也许可以将 XMLHttpRequest 封装在本地定义的 CustomXMLHttpRequest 中? - Shadow Man
是的,我也认为reallySend也是一种hack方法!我试图实现一种不可知论的完成方法。我正在使用一个混合了jQuery和Backbone XHR调用实现的应用程序。所以我的想法是它们最终都会到达XMLHttpRequest.prototype.send...对吗?(也许情况并非如此 :) ) - neolaser
那是一个实现细节。也许它们都调用send,但即使如此,你能保证它们不会(永远不会)覆盖发送方法吗?由于你无法控制库,因此只能说明你正在使用的当前版本的情况。尽可能使用API,因为它们被设计为这样。即使实现更改以加快速度或修复一些错误,它们也很可能保持不变。 - Shadow Man
这个代码是有效的,但是在IE8中重新放回去时会导致“send”函数重复。这是在运行您的代码后从IE8中XMLHttpRequest.prototype的转储: abort:abort(), getAllResponseHeaders:getAllResponseHeaders(), getResponseHeader:getResponseHeader(), open:open(), reallySend:send(), send:function(), send:function(), setRequestHeader:setRequestHeader() - tripRev
1个回答

0
你需要做类似这样的事情。
CoffeeScript 代码
define [
    'jquery'
], ($) ->
   loadElement = $('someContent')

   $(document)
      .ajaxStart(-> $(loadElement).show())
      .ajaxStop(-> $(loadElement).hide())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接