updated PreloadStore API

so that it is more clear that we are deleting preloaded data once read
This commit is contained in:
Régis Hanol 2013-03-20 16:26:46 +01:00
parent 04c6087ef0
commit f1015fd73a
7 changed files with 51 additions and 61 deletions

View File

@ -184,10 +184,11 @@ Discourse = Ember.Application.createWithMixins({
start: function() { start: function() {
Discourse.bindDOMEvents(); Discourse.bindDOMEvents();
Discourse.SiteSettings = PreloadStore.getStatic('siteSettings'); Discourse.SiteSettings = PreloadStore.get('siteSettings');
Discourse.MessageBus.start(); Discourse.MessageBus.start();
Discourse.KeyValueStore.init("discourse_", Discourse.MessageBus); Discourse.KeyValueStore.init("discourse_", Discourse.MessageBus);
// Make sure we delete preloaded data
PreloadStore.remove('siteSettings');
// Developer specific functions // Developer specific functions
Discourse.Development.setupProbes(); Discourse.Development.setupProbes();
Discourse.Development.observeLiveChanges(); Discourse.Development.observeLiveChanges();

View File

@ -430,7 +430,7 @@ Discourse.Topic.reopenClass({
} }
// Check the preload store. If not, load it via JSON // Check the preload store. If not, load it via JSON
return PreloadStore.get("topic_" + topicId, function() { return PreloadStore.getAndRemove("topic_" + topicId, function() {
return $.getJSON(url + ".json", data); return $.getJSON(url + ".json", data);
}).then(function(result) { }).then(function(result) {
var first = result.posts.first(); var first = result.posts.first();

View File

@ -106,7 +106,7 @@ Discourse.TopicList.reopenClass({
Discourse.set('transient.topicsList', null); Discourse.set('transient.topicsList', null);
Discourse.set('transient.topicListScrollPos', null); Discourse.set('transient.topicListScrollPos', null);
return PreloadStore.get("topic_list", function() { return $.getJSON(url) }).then(function(result) { return PreloadStore.getAndRemove("topic_list", function() { return $.getJSON(url) }).then(function(result) {
topic_list.set('topics', Discourse.TopicList.topicsFrom(result)); topic_list.set('topics', Discourse.TopicList.topicsFrom(result));
topic_list.set('can_create_topic', result.topic_list.can_create_topic); topic_list.set('can_create_topic', result.topic_list.can_create_topic);
topic_list.set('more_topics_url', result.topic_list.more_topics_url); topic_list.set('more_topics_url', result.topic_list.more_topics_url);

View File

@ -437,7 +437,7 @@ Discourse.User.reopenClass({
find: function(username) { find: function(username) {
// Check the preload store first // Check the preload store first
return PreloadStore.get("user_" + username, function() { return PreloadStore.getAndRemove("user_" + username, function() {
return $.ajax({ url: Discourse.getURL("/users/") + username + '.json' }); return $.ajax({ url: Discourse.getURL("/users/") + username + '.json' });
}).then(function (json) { }).then(function (json) {

View File

@ -8,13 +8,13 @@
**/ **/
Discourse.ApplicationRoute = Discourse.Route.extend({ Discourse.ApplicationRoute = Discourse.Route.extend({
setupController: function(controller) { setupController: function(controller) {
var currentUser; Discourse.set('site', Discourse.Site.create(PreloadStore.get('site')));
Discourse.set('site', Discourse.Site.create(PreloadStore.getStatic('site'))); var currentUser = PreloadStore.get('currentUser');
currentUser = PreloadStore.getStatic('currentUser');
if (currentUser) { if (currentUser) {
Discourse.set('currentUser', Discourse.User.create(currentUser)); Discourse.set('currentUser', Discourse.User.create(currentUser));
} }
// make sure we delete preloaded data
PreloadStore.remove('site');
PreloadStore.remove('currentUser');
} }
}); });

View File

@ -20,17 +20,17 @@ PreloadStore = {
}, },
/** /**
To retrieve a key, you provide the key you want, plus a finder to To retrieve a key, you provide the key you want, plus a finder to load
load it if the key cannot be found. Once the key is used once, it is it if the key cannot be found. Once the key is used once, it is removed
removed from the store. So, for example, you can't load a preloaded topic from the store.
more than once. So, for example, you can't load a preloaded topic more than once.
@method get @method getAndRemove
@param {String} key the key to look up the object with @param {String} key the key to look up the object with
@param {function} finder a function to find the object with @param {function} finder a function to find the object with
@returns {Ember.Deferred} a promise that will eventually be the object we want. @returns {Ember.Deferred} a promise that will eventually be the object we want.
**/ **/
get: function(key, finder) { getAndRemove: function(key, finder) {
var preloadStore = this; var preloadStore = this;
return Ember.Deferred.promise(function(promise) { return Ember.Deferred.promise(function(promise) {
if (preloadStore.data[key]) { if (preloadStore.data[key]) {
@ -59,28 +59,25 @@ PreloadStore = {
}, },
/** /**
Does the store contain a particular key? Does not delete. If we are sure it's preloaded, we don't have to supply a finder.
Just returns undefined if it's not in the store.
@method contains @method get
@param {String} key the key to look up the object with
@returns {Boolean} whether the object exists
**/
contains: function(key) {
return this.data[key] !== void 0;
},
/**
If we are sure it's preloaded, we don't have to supply a finder. Just returns
undefined if it's not in the store.
@method getStatic
@param {String} key the key to look up the object with @param {String} key the key to look up the object with
@returns {Object} the object from the store @returns {Object} the object from the store
**/ **/
getStatic: function(key) { get: function(key) {
var result = this.data[key]; return this.data[key];
delete this.data[key]; },
return result;
/**
Removes the stored value if the key exists
@method remove
@param {String} key the key to remove
**/
remove: function(key) {
if (this.data[key]) delete this.data[key];
} }
}; };

View File

@ -6,41 +6,33 @@ describe("PreloadStore", function() {
PreloadStore.store('bane', 'evil'); PreloadStore.store('bane', 'evil');
}); });
describe("contains", function() { describe('get', function() {
it("returns false for a key that doesn't exist", function() {
expect(PreloadStore.contains('joker')).toBe(false);
});
it("returns true for a stored key", function() {
expect(PreloadStore.contains('bane')).toBe(true);
});
});
describe('getStatic', function() {
it("returns undefined if the key doesn't exist", function() { it("returns undefined if the key doesn't exist", function() {
expect(PreloadStore.getStatic('joker')).toBe(void 0); expect(PreloadStore.get('joker')).toBe(undefined);
}); });
it("returns the the key if it exists", function() { it("returns the value if the key exists", function() {
expect(PreloadStore.getStatic('bane')).toBe('evil'); expect(PreloadStore.get('bane')).toBe('evil');
});
it("removes the key after being called", function() {
PreloadStore.getStatic('bane');
expect(PreloadStore.getStatic('bane')).toBe(void 0);
}); });
}); });
describe('get', function() { describe('remove', function() {
it("removes the value if the key exists", function() {
PreloadStore.remove('bane');
expect(PreloadStore.get('bane')).toBe(undefined);
});
});
describe('getAndRemove', function() {
it("returns a promise that resolves to null", function() { it("returns a promise that resolves to null", function() {
var done, storeResult; var done, storeResult;
done = storeResult = null; done = storeResult = null;
PreloadStore.get('joker').then(function(result) { PreloadStore.getAndRemove('joker').then(function(result) {
done = true; done = true;
storeResult = result; storeResult = result;
}); });
@ -54,7 +46,7 @@ describe("PreloadStore", function() {
var done, finder, storeResult; var done, finder, storeResult;
done = storeResult = null; done = storeResult = null;
finder = function() { return 'evil'; }; finder = function() { return 'evil'; };
PreloadStore.get('joker', finder).then(function(result) { PreloadStore.getAndRemove('joker', finder).then(function(result) {
done = true; done = true;
storeResult = result; storeResult = result;
}); });
@ -70,7 +62,7 @@ describe("PreloadStore", function() {
finder = function() { finder = function() {
return Ember.Deferred.promise(function(promise) { promise.resolve('evil'); }); return Ember.Deferred.promise(function(promise) { promise.resolve('evil'); });
}; };
PreloadStore.get('joker', finder).then(function(result) { PreloadStore.getAndRemove('joker', finder).then(function(result) {
done = true; done = true;
storeResult = result; storeResult = result;
}); });
@ -86,7 +78,7 @@ describe("PreloadStore", function() {
finder = function() { finder = function() {
return Ember.Deferred.promise(function(promise) { promise.reject('evil'); }); return Ember.Deferred.promise(function(promise) { promise.reject('evil'); });
}; };
PreloadStore.get('joker', finder).then(null, function(rejectedResult) { PreloadStore.getAndRemove('joker', finder).then(null, function(rejectedResult) {
done = true; done = true;
storeResult = rejectedResult; storeResult = rejectedResult;
}); });
@ -99,7 +91,7 @@ describe("PreloadStore", function() {
it("returns a promise that resolves to 'evil'", function() { it("returns a promise that resolves to 'evil'", function() {
var done, storeResult; var done, storeResult;
done = storeResult = null; done = storeResult = null;
PreloadStore.get('bane').then(function(result) { PreloadStore.getAndRemove('bane').then(function(result) {
done = true; done = true;
storeResult = result; storeResult = result;
}); });