Ответ 1
Я не эксперт Ember, но думаю, что вы можете решить свою проблему с помощью чистого решения JS.
Данные запроса Ember Data возвращают Promises, например. return this.store.findAll('blog-post'); // => Promise
, мы можем кэшировать promises в простом объекте с функциями более высокого порядка (функции, возвращающие функции). Кэш объектов можно заменить на localStorage
, sessionStorage
, Map
или даже WeakMap
, но я использую кеш-объект, чтобы все было понятным.
В основном вы хотите заменить следующий вызов:
return this.store.findAll('blog-post');
с чем-то более или менее похожим:
return cachedStore.findAll('blog-post');
на самом деле, с нижеприведенным решением это может выглядеть по-другому:
return cachedStore.call(this, 'findAll', 'blog-post');
В результате вы будете запрашивать данные один раз и всегда возвращаться из кеша при последующих вызовах.
Позвольте мне показать вам, как может выглядеть реализация:
var cachedStore = (function () {
// Your cache - in this case simple object literal
var cache = {};
// Actual method that will check cache for results before trying to query services
return function (method) {
var args = Array.prototype.slice.call(arguments, 1);
var serializedArgs = JSON.stringify(args);
if (!(serializedArgs in cache)) {
cache[serializedArgs] = this.store[method].apply(this, args);
}
return cache[serializedArgs];
};
}());
И вот пример использования:
// Fires a request
cachedStore.call(this, 'findAll', 'blog-post');
// Returns from cache
cachedStore.call(this, 'findAll', 'blog-post');
// Returns from cache
cachedStore.call(this, 'findAll', 'blog-post');
// Fires a request
cachedStore.call(this, 'findRecord', 'blog-post', 123);
// Returns from cache
cachedStore.call(this, 'findRecord', 'blog-post', 123);
// Returns from cache
cachedStore.call(this, 'findRecord', 'blog-post', 123);
Помогает ли это в любом случае?