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() {
Discourse.bindDOMEvents();
Discourse.SiteSettings = PreloadStore.getStatic('siteSettings');
Discourse.SiteSettings = PreloadStore.get('siteSettings');
Discourse.MessageBus.start();
Discourse.KeyValueStore.init("discourse_", Discourse.MessageBus);
// Make sure we delete preloaded data
PreloadStore.remove('siteSettings');
// Developer specific functions
Discourse.Development.setupProbes();
Discourse.Development.observeLiveChanges();

View File

@ -430,7 +430,7 @@ Discourse.Topic.reopenClass({
}
// 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);
}).then(function(result) {
var first = result.posts.first();

View File

@ -106,7 +106,7 @@ Discourse.TopicList.reopenClass({
Discourse.set('transient.topicsList', 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('can_create_topic', result.topic_list.can_create_topic);
topic_list.set('more_topics_url', result.topic_list.more_topics_url);

View File

@ -437,7 +437,7 @@ Discourse.User.reopenClass({
find: function(username) {
// 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' });
}).then(function (json) {

View File

@ -8,13 +8,13 @@
**/
Discourse.ApplicationRoute = Discourse.Route.extend({
setupController: function(controller) {
var currentUser;
Discourse.set('site', Discourse.Site.create(PreloadStore.getStatic('site')));
currentUser = PreloadStore.getStatic('currentUser');
Discourse.set('site', Discourse.Site.create(PreloadStore.get('site')));
var currentUser = PreloadStore.get('currentUser');
if (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
load it if the key cannot be found. Once the key is used once, it is
removed from the store. So, for example, you can't load a preloaded topic
more than once.
To retrieve a key, you provide the key you want, plus a finder to load
it if the key cannot be found. Once the key is used once, it is removed
from the store.
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 {function} finder a function to find the object with
@returns {Ember.Deferred} a promise that will eventually be the object we want.
**/
get: function(key, finder) {
getAndRemove: function(key, finder) {
var preloadStore = this;
return Ember.Deferred.promise(function(promise) {
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
@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
@method get
@param {String} key the key to look up the object with
@returns {Object} the object from the store
**/
getStatic: function(key) {
var result = this.data[key];
delete this.data[key];
return result;
get: function(key) {
return this.data[key];
},
/**
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');
});
describe("contains", 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() {
describe('get', 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() {
expect(PreloadStore.getStatic('bane')).toBe('evil');
});
it("removes the key after being called", function() {
PreloadStore.getStatic('bane');
expect(PreloadStore.getStatic('bane')).toBe(void 0);
it("returns the value if the key exists", function() {
expect(PreloadStore.get('bane')).toBe('evil');
});
});
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() {
var done, storeResult;
done = storeResult = null;
PreloadStore.get('joker').then(function(result) {
PreloadStore.getAndRemove('joker').then(function(result) {
done = true;
storeResult = result;
});
@ -54,7 +46,7 @@ describe("PreloadStore", function() {
var done, finder, storeResult;
done = storeResult = null;
finder = function() { return 'evil'; };
PreloadStore.get('joker', finder).then(function(result) {
PreloadStore.getAndRemove('joker', finder).then(function(result) {
done = true;
storeResult = result;
});
@ -70,7 +62,7 @@ describe("PreloadStore", function() {
finder = function() {
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;
storeResult = result;
});
@ -86,7 +78,7 @@ describe("PreloadStore", function() {
finder = function() {
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;
storeResult = rejectedResult;
});
@ -99,7 +91,7 @@ describe("PreloadStore", function() {
it("returns a promise that resolves to 'evil'", function() {
var done, storeResult;
done = storeResult = null;
PreloadStore.get('bane').then(function(result) {
PreloadStore.getAndRemove('bane').then(function(result) {
done = true;
storeResult = result;
});