mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
updated PreloadStore API
so that it is more clear that we are deleting preloaded data once read
This commit is contained in:
parent
04c6087ef0
commit
f1015fd73a
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
|
@ -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) {
|
||||||
|
|
||||||
|
@ -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');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@ -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];
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -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;
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user