我用微风开发了一个应用程序。我需要在本地缓存中检索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时:查询在本地缓存中找不到任何内容,然后在fetchSucceed
中s.isPartial()
发生错误,因为undefined
中有s。
我的问题:为什么在第二种情况下刷新浏览器似乎清除了breeze的本地缓存?如何避免这种行为?
感谢。
答案 0 :(得分:2)
按下F5时,Breeze始终清除本地缓存。 F5使浏览器重新加载整个页面并执行每个js页面(从main.js开始)。
您会看到不同的行为,因为fetchEntityByKey函数中的第三个参数指示Breeze在本地缓存上搜索,如果未找到,则向服务器发出请求。
在你的第二个场景中,你告诉Breeze从localcache获取实体(.using(breeze.FetchStrategy.FromLocalCache);)因为如果实体不在本地缓存中,Breeze将永远不会命中服务器。 / p>