如何将查询结果caching在余烬数据中
我想要将查询的结果caching在ember-data中。 ( findQuery
)
要说清楚:我不想caching整个模型; 只是查询的结果是什么模型。 这是正确的地方在哪里?
我想在适配器中实现这个,并cachingAJAX调用的结果,但我不认为这是一个好的解决scheme,因为我不想重载加载,也许更新和/或修改模型数据。
我不认为它可能只是返回一个ID列表,并操纵适配器和串行器这个简单的用例似乎是凌乱的!
其实我不希望findQuery
被称为特定types的querys。 就像findAll
的行为一样。 尼斯会像一个queryShouldBeCached
钩子。
有这个好的解决scheme吗?
我不是Ember的专家,但我想你可以用一个纯粹的JS解决scheme解决你的问题。
给定Ember数据查询返回Promises,例如return this.store.findAll('blog-post'); // => Promise
return this.store.findAll('blog-post'); // => Promise
,我们可以使用高阶函数(返回函数的函数)在一个简单的对象中cachingpromise。 对象caching可以用localStorage
, sessionStorage
, Map
甚至WeakMap
但我使用对象caching来使事情变得简单易懂。
你想实质上做的是取代以下呼吁:
return this.store.findAll('blog-post');
有一些或多或less的东西:
return cachedStore.findAll('blog-post');
实际上,下面的解决scheme可能看起来更像:
return cachedStore.call(this, 'findAll', 'blog-post');
因此,您将请求数据一次,并在随后的调用中始终从caching中返回。
让我告诉你如何实现可能是这样的:
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);
这有帮助吗?
当你发出一个基于参数Ember的请求时,数据并不知道这些参数是如何转化为模型的(也就是说,它不知道你拥有所有的有关系的loggingparam1)。 你可以自己caching,但是你仍然需要某种方式来知道你商店中其他logging的logging。
- 为什么OpenCV的MSER的Python实现和Java实现创build不同的输出?
- 拥有带有InfiniBand的Windows Azure A8节点支持如何从一个节点发送N个字节并在另一个节点上接收?