【问题标题】:Backbone.js intercept AJAX requestsBackbone.js 拦截 AJAX 请求
【发布时间】: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


【解决方案1】:

你需要做这样的事情。

CoffeeScript 代码

define [
    'jquery'
], ($) ->
   loadElement = $('someContent')

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

【讨论】:

    猜你喜欢
    • 2011-12-26
    • 1970-01-01
    • 2016-06-18
    • 2015-06-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多