Created by Tim Branyen @tbranyen.
This is useful for when you have Models and Collections that once data is
fetched you can operate with the same dataset throughout the lifetime of your
application. Whatever route your application starts with can safely call the
fetch
method to get the data into the instances.
Tested with Underscore, Backbone and jQuery. You can swap out jQuery with a custom configuration or substitute Underscore with Lo-Dash.
Every fetch
method is patched to return a Deferred, instead of the jqXHR
object in jQuery.ajax
. If you call fetch
multiple times while it is
fetching or after it's fetched, you will always get the same Deferred and it
will not make additional requests.
Cancelling is super simple, just add the reload
option:
fetch({ reload: true });
optionally you can make a Model or Collection always reload
by doing the
following (works with Models too):
Backbone.Collection.extend({
reload: true
}):
Since you're getting a brand new deferred and nothing ever happens to the old
one you can be assured that fetch callbacks will only trigger after the most
recent fetch
has completed.
If you want use underscore.deferred
or some other implementation you can
specify an override to swap out that dependency.
Backbone.Collection.prototype.fetch.deferred = function() {
return _.Deferred();
};
It's entirely possible that requests will come back out of order if you use the
{ reload: true }
option. This is most likely not your intention. If you
agree, you should put the following plugin into your project. CacheIt will
work seamlessly.
https://github.com/amccloud/backbone-safesync
- Initial beta release.