Как использовать хранилище Dojo для кэширования данных на стороне клиента?


Мне трудно понять, как реализовать кэширование на стороне клиента. В моем примере кода каждый вызов с помощью store.get(id) создает новый HTTP-запрос. Насколько я могу судить, данные не извлекаются из локальной памяти.

В документации для dojo/store/Cache ясно указано, что данные хранятся в локальном кэше памяти после завершения первого запроса GET. Последующие запросы извлекаются из локальной памяти.

Однако, используя Firefox Web Inspector, я вижу мой код создает новый HTTP-запрос каждый раз. Что я делаю не так?

Код:

require(["dojo/store/JsonRest", "dojo/store/Memory", "dojo/store/Cache", "dojo/domReady!"], function(JsonRest, Memory, Cache) {

    var restStore = new JsonRest({target:"/rest/Vendor/"});
    var memoryStore = new Memory({});
    var store = new Cache(restStore, memoryStore);

    var object = store.get("5").then(function(value) {
        console.log("Vendor Name: ", value.name);
    });

    var object = store.get("5").then(function(value) {
        console.log("Vendor Name: ", value.name);
    });

    var object = store.get("5").then(function(value) {
        console.log("Vendor Name: ", value.name);
    });

});

Вывод Веб-Инспектора

[22:28:59.585] GET http://my-website-url.com/rest/Vendor/5 [HTTP/1.1 200 OK 596ms]
[22:28:59.588] GET http://my-website-url/rest/Vendor/5 [HTTP/1.1 200 OK 40ms]
[22:28:59.153] "Vendor Name: " "Company E"
[22:28:59.589] GET http://my-website-url/rest/Vendor/5 [HTTP/1.1 200 OK 36ms]
[22:28:59.196] "Vendor Name: " "Company E"
[22:28:59.235] "Vendor Name: " "Company E"

Вывод JSON из вызова Rest

[
    {"name":"Company A","vendorId":1,"active":1},
    {"name":"Company B","vendorId":2,"active":1},
    {"name":"Company C","vendorId":3,"active":1},
    {"name":"Company D","vendorId":4,"active":1},
    {"name":"Company E","vendorId":5,"active":1}
]
1 3

1 ответ:

Я думаю, что вы должны предоставить "idProperty" как в хранилище JsonRest, так и в хранилище памяти, потому что "кэш" попытается найти объект с идентификатором "5" в своем кэше. Поскольку вы не указали, какое свойство идентифицирует объект, он не найдет запись в кэше и не выполнит запрос HTTP снова.

Короче говоря: я ожидал бы, что он будет работать, когда вы указываете idProperty для магазина, например:

var restStore = new JsonRest({target:"/rest/Vendor/", idProperty: "vendorId"});
var memoryStore = new Memory({idProperty: "vendorId"});