包装骨干同步请求

时间:2012-02-14 10:12:55

标签: javascript rest backbone.js

我正在编写Backbone应用程序,每当向服务器发出请求时,我都需要向用户提供一些反馈(烦人,我知道,但我无法控制应用程序的这种行为)。后端总是报告每条响应的信息(至少在理论上),如

{
  "status":"error",
  "message":"something went really wrong"
}

{
  "status":"success",
  "message":"congratulations",
  "data":{...}
}

我想了解的是在哪里为某种消息传递服务设置钩子。

一种可能性是模型和集合的parse()方法。为了避免重复,我必须把它放在一些模型基类中。它仍然有点烦人,因为所有模型和集合都有自己的parse()

更合理的地方是Backbone.sync功能。但是我不想覆盖它,而是想把它包装在其他一些辅助函数中。这里的问题是我找不到一个好的钩子,在每个请求中放置一些逻辑来执行。

  

对于如何组织每个请求要执行的逻辑,您有什么建议吗?

2 个答案:

答案 0 :(得分:7)

由于Backbone.sync返回$.ajax返回的内容,因此使用jQuery委托很容易实现我想要的,就像这样

var originalMethod = Backbone.sync;

Backbone.sync = function(method, model, options) {
    var request = originalMethod.call(Backbone, method, model, options);

    request.done(function(msg) {
        console.log(msg);
    });
    request.fail(function(jqXHR, textStatus) {
        console.log(jqXHR, textStatus);
    });
    return request;
};

答案 1 :(得分:3)

假设您使用的是最近的(> 1.5)jquery,则来自同步的所有结果都将返回$.ajax承诺。 您可以在不使用该承诺覆盖任何同步的情况下执行此操作。例如,如果您执行了fetch(),则可以执行以下操作:

var p = mymodel.fetch();
p.done(function (res) { ... });
p.fail(function (err) { ... });

当然你也可以在fetch选项中使用回调,但我发现上面的内容更清晰。相同的模式适用于说保存或使用同步的任何内容。