discourse/app/assets/javascripts/preload_store.js
Robin Ward d1d4530efd User Profile enhancements:
- Added PreloadStore support to avoid duplicate requests
- preliminary SEO
- Support for opengraph/twitter cards
2013-03-08 15:04:37 -05:00

86 lines
2.2 KiB
JavaScript

/**
We can insert data into the PreloadStore when the document is loaded.
The data can be accessed once by a key, after which it is removed
@class PreloadStore
**/
PreloadStore = {
data: {},
/**
Store an object in the store
@method store
@param {String} key the key to store the object with
@param {String} value the object we're inserting into the store
**/
store: function(key, value) {
this.data[key] = value;
},
/**
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
@param {String} key the key to look up the object with
@param {function} finder a function to find the object with
@returns {Promise} a promise that will eventually be the object we want.
**/
get: function(key, finder) {
var promise = new RSVP.Promise();
if (this.data[key]) {
promise.resolve(this.data[key]);
delete this.data[key];
} else {
if (finder) {
var result = finder();
// If the finder returns a promise, we support that too
if (result.then) {
result.then(function(result) {
return promise.resolve(result);
}, function(result) {
return promise.reject(result);
});
} else {
promise.resolve(result);
}
} else {
promise.resolve(null);
}
}
return promise;
},
/**
Does the store contain a particular key? Does not delete.
@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
@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;
}
};