在'EntityQuery.fromEntityKey'之后按F5似乎用breeze清除本地缓存

时间:2013-04-04 08:39:31

标签: breeze

我用微风开发了一个应用程序。我需要在本地缓存中检索id = 123的实体,所以我最终得到第一个场景:

return manager.fetchEntityByKey("Transport", 123, true) // 3rd param is true --> local cache
              .then(fetchSucceeded)
              .fail(queryFailed);

function fetchSucceeded(data) {
        var s = data.entity;
        return s.isPartial() ? refreshTransport(s) : transportObservable(s);
}

接下来我需要扩展一些属性,所以我最终得到了第二个场景:

var entityType = manager.metadataStore.getEntityType("Transport");
var entityKey = new EntityKey(entityType, 123);
var query = EntityQuery.fromEntityKey(entityKey)
                       .expand("Sender.City, Sender.City.Country")
                       .using(breeze.FetchStrategy.FromLocalCache);

return manager.executeQuery(query)
              .then(fetchSucceeded)
              .fail(queryFailed);

function fetchSucceeded(data) {
     var s = data.results[0];
     return s.isPartial() ? refreshTransport(s) : transportObservable(s);
}

我对这两种情况进行了一些测试,并且在刷新浏览器时注意到了区别(F5)。

第一种情况:按F5时:查询能够检索本地缓存中的数据。因此用户可以按F5多次,而breeze仍然会使用本地缓存。

第二种情况:当按F5时:查询在本地缓存中找不到任何内容,然后在fetchSucceeds.isPartial()发生错误,因为undefined中有s。

我的问题:为什么在第二种情况下刷新浏览器似乎清除了breeze的本地缓存?如何避免这种行为?

感谢。

1 个答案:

答案 0 :(得分:2)

按下F5时,Breeze始终清除本地缓存。 F5使浏览器重新加载整个页面并执行每个js页面(从main.js开始)。

您会看到不同的行为,因为fetchEntityByKey函数中的第三个参数指示Breeze在本地缓存上搜索,如果未找到,则向服务器发出请求。

在你的第二个场景中,你告诉Breeze从localcache获取实体(.using(breeze.FetchStrategy.FromLocalCache);)因为如果实体不在本地缓存中,Breeze将永远不会命中服务器。 / p>