javascript jquery caching ember.js ember-data

javascript - Cómo guardar el resultado de la consulta en los datos de las brasas



jquery caching (2)

Cuando activa una solicitud basada en params Ember Data no sabe cómo esos parametros necesariamente se traducen en los modelos (también conocido como que no sabe que tiene todos los registros que tienen algún tipo de relación param1). Puede almacenarlo en caché, pero aún necesita algún tipo de forma de conocer esos registros de otros registros en su tienda.

Quiero guardar en caché el resultado de una consulta en Ember-Data. ( findQuery )

Para dejarlo en claro: no quiero almacenar en caché todos los modelos; qué modelos son el resultado de la consulta. ¿Dónde está el lugar correcto para esto?

Estaba pensando en implementar esto en el adaptador y almacenar en caché el resultado de la llamada AJAX, pero no creo que esta sea una buena solución, ya que no quiero anular los datos del modelo cargado y quizás más nuevo y / o modificado.

¡No creo que sea posible simplemente devolver una lista de ID, y manipular el adaptador y el serializador para este caso de uso simple parece ser complicado!

En realidad, no quiero que findQuery se llame para tipos específicos de querys. Como el comportamiento de findAll . Niza sería algo así como un enganche queryShouldBeCached .

¿Hay una buena solución para esto?


No soy un experto en Ember, pero creo que puedes resolver tu problema con una solución JS pura.

Las consultas dadas de Ember Data devuelven promesas, por ejemplo, return this.store.findAll(''blog-post''); // => Promise return this.store.findAll(''blog-post''); // => Promise , podemos guardar promesas en un objeto simple con funciones de orden superior (funciones que devuelven funciones). El caché de objetos podría reemplazarse con localStorage , sessionStorage , Map o incluso WeakMap pero estoy usando el caché de objetos para que todo sea fácil de entender.

Lo que básicamente quieres hacer es reemplazar la siguiente llamada:

return this.store.findAll(''blog-post'');

con algo más o menos como:

return cachedStore.findAll(''blog-post'');

de hecho, con la solución a continuación podría parecerse más a:

return cachedStore.call(this, ''findAll'', ''blog-post'');

Como resultado, solicitará datos una vez y siempre regresará de la memoria caché en las siguientes llamadas.

Déjame mostrarte cómo se vería la implementación:

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]; }; }());

Y aquí hay un uso de muestra:

// 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);

¿Eso ayuda de alguna manera?