最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Wrapping Backbone sync requests - Stack Overflow

programmeradmin1浏览0评论

I am writing a Backbone application, and I need to offer some feedback to users whenever a request to the server is made (annoying, I know, but I have no control over this behaviour of the application). The backend always reports an informative (at least in theory) message with every response, like

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

or

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

What I would like to understand is where to put a hook for some kind of messaging service.

One possibility is the parse() method for models and collections. To avoid duplication, I would have to put it inside some model base class. It is still a bit annoying since all models and collections have their own parse() anyway.

A more reasonable place to look would be the Backbone.sync function. But I do not want to overwrite it, instead I would like to wrap it inside some other helper function. The problem here is that I cannot find a good hook where to put some logic to be executed with every request.

Do you have any suggestions on how to organize some piece of logic to be executed with every request?

I am writing a Backbone application, and I need to offer some feedback to users whenever a request to the server is made (annoying, I know, but I have no control over this behaviour of the application). The backend always reports an informative (at least in theory) message with every response, like

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

or

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

What I would like to understand is where to put a hook for some kind of messaging service.

One possibility is the parse() method for models and collections. To avoid duplication, I would have to put it inside some model base class. It is still a bit annoying since all models and collections have their own parse() anyway.

A more reasonable place to look would be the Backbone.sync function. But I do not want to overwrite it, instead I would like to wrap it inside some other helper function. The problem here is that I cannot find a good hook where to put some logic to be executed with every request.

Do you have any suggestions on how to organize some piece of logic to be executed with every request?

Share Improve this question asked Feb 14, 2012 at 10:12 AndreaAndrea 20.5k25 gold badges117 silver badges186 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 7

Since Backbone.sync returns whatever $.ajax returns, it is easy to achieve what I want by using jQuery delegates, like this

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;
};

Assuming you are using a recent (>1.5) jquery all results from sync will return the $.ajax promise. You can do it then without overriding anything in sync by using that promise. For example, if you did a fetch(), you could do:

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

Of course you can also use callbacks in fetch options, but I find the above much cleaner. The same pattern applies for say save or anything that uses sync.

发布评论

评论列表(0)

  1. 暂无评论