discourse/app/assets/javascripts/preload-store.js.es6

59 lines
1.3 KiB
Plaintext
Raw Normal View History

2016-07-05 02:15:51 +08:00
/**
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
**/
import { Promise } from "rsvp";
2016-07-05 02:15:51 +08:00
export default {
data: {},
store(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.
**/
getAndRemove(key, finder) {
if (this.data[key]) {
let promise = Promise.resolve(this.data[key]);
2016-07-05 02:15:51 +08:00
delete this.data[key];
return promise;
}
if (finder) {
return new Promise(function(resolve, reject) {
let result = finder();
2016-07-05 02:15:51 +08:00
// If the finder returns a promise, we support that too
if (result && result.then) {
2018-06-15 23:03:24 +08:00
result
.then(toResolve => resolve(toResolve))
.catch(toReject => reject(toReject));
2016-07-05 02:15:51 +08:00
} else {
resolve(result);
}
});
}
return Promise.resolve(null);
2016-07-05 02:15:51 +08:00
},
get(key) {
return this.data[key];
},
remove(key) {
if (this.data[key]) delete this.data[key];
},
reset() {
this.data = {};
}
};