如何在 Backbone 提取调用中的 ajax 调用后调用“.done”

How to call ".done" after the ajax call in Backbone fetch calls

我调用 returns 200 的 RESTful API 不是抛出错误,而是使用 "fault" 对象作为 return 的一部分服务器端出错时的数据。我无法更改 API。为了处理这个问题(没有 Backbone),所有 ajax 调用都包含在一个 class 中,在 ajax 调用之后调用“.done”来处理任何 "fault" 可能包含在响应中。此外,一些呼叫者需要能够指定指示应在何处显示故障的设置,而其他呼叫者则依赖于默认位置。

我想更改代码以使用 Backbone 的同步功能来保存和检索我的模型和集合,但我不确定如何注入所需的设置值和 .done 函数。我可以覆盖原型同步方法并将其更改为调用我们的自定义 ajax 方法,但这是一个非常复杂的函数,我很担心我会破坏某些东西。我宁愿找到一些更轻松的方法来调用 ajax 调用结果的“.done”,但我很难弄清楚如何。

我了解如何通过覆盖 Backbone.Model.prototype.fetch 和 Backbone.Collection.prototype.fetch 来注入额外的错误处理程序或成功处理程序,根据此 post - How to add a default error handler to all Backbone models?。但是,这并不能让我直接访问实际的 ajax 调用 return 所以我没有任何可以调用“.done”的东西,而且 "fetch" 只涵盖 "get" ajax 个调用,我需要处理所有 Backbone ajax 个调用的错误。

有人知道如何处理这个吗?

非常感谢!

我决定覆盖 Backbone.ajax。

我发现我在调用 fetch 时设置的任何属性(我假设这也适用于保存和销毁,但尚未测试)由框架传递给此方法,因此它们可用于我在那里根据需要。我对我如何对 Backbone 的实现做出假设并不感到兴奋(即假设参数将以特定格式传递给 Backbone.ajax),但这似乎仍然是最干净的方式.

这是我的一些代码,因此您可以看到我是如何读取 errorHandlingSettings 参数的。请注意,参数不会直接传递到 Backbone.ajax - 它们由 Backbone 存储,然后在那里引用:

Backbone.ajax = function() {
    var currentArguments = {};
    if(typeof(arguments.callee) != 'undefined' 
        && typeof(arguments.callee.arguments) != 'undefined')
         currentArguments = arguments.callee.arguments[0];
   var errorHandlingSettings = {};
   if(typeof(currentArguments.errorHandlingSettings) != 'undefined')
      errorHandlingSettings = currentArguments.errorHandlingSettings;
      ... etc. - store the "successIfNoFaults" variable.
   var handleFaults = function(data){
      ... etc. (custom code using the errorHandlingSettings and successIfNoFaults variables) ...
   };

   return Backbone.$.ajax.apply(Backbone.$, arguments).done(handleFaults);
};

下面是我传递 errorHandlingSettings 参数的方式(在我的视图的初始化方法中):

this.reservationHold.fetch({errorHandlingSettings: {errorPlace:"1",errorPosition:"errorDiv"}, successIfNoFaults:function(){that.render();}});

请注意,我还传递了另一个自定义参数 "successIfNoFaults",这样我就可以避免在返回带有故障的 200 响应时调用 "success" 回调。