我正在编写Backbone应用程序,每当向服务器发出请求时,我都需要向用户提供一些反馈(烦人,我知道,但我无法控制应用程序的这种行为)。后端总是报告每条响应的信息(至少在理论上),如
{
"status":"error",
"message":"something went really wrong"
}
或
{
"status":"success",
"message":"congratulations",
"data":{...}
}
我想了解的是在哪里为某种消息传递服务设置钩子。
一种可能性是模型和集合的parse()
方法。为了避免重复,我必须把它放在一些模型基类中。它仍然有点烦人,因为所有模型和集合都有自己的parse()
。
更合理的地方是Backbone.sync
功能。但是我不想覆盖它,而是想把它包装在其他一些辅助函数中。这里的问题是我找不到一个好的钩子,在每个请求中放置一些逻辑来执行。
对于如何组织每个请求要执行的逻辑,您有什么建议吗?
答案 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选项中使用回调,但我发现上面的内容更清晰。相同的模式适用于说保存或使用同步的任何内容。