如何将查询结果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可以用localStoragesessionStorageMap甚至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。