我有一个使用 Breeze 来查询数据的应用程序。如果没有返回结果,我想先检查本地缓存,然后再检查服务器缓存(我遵循了 John Papa 的 SPA 快速入门课程)。但是,我发现了我的逻辑中的一个缺陷,我不确定如何修复。假设我有 10 个项目与我的查询匹配。
情况 1(可行):我转到显示所有 10 个的列表页面(页面 A)。因为缓存为空,所以命中服务器并将所有 10 个添加到缓存中。然后转到显示在缓存中找到的 1 个结果(页面 B)的页面。所以一切都很好。
情况2(问题):我首先转到显示1条记录的页面(页面B)。然后我转到我的列表页面(页面 A),它检查缓存并找到 1 条记录,并且由于这条线 ( if (recordsInCache.length > 0)
) 它退出并仅显示 1 条记录。
我不知何故需要知道服务器(9)上有更多不在缓存中的记录,即。这个查询的总记录实际上是 10,我有 1 因此我必须为其他 9 打服务器。
这是我对页面 A 的查询:
function getDaresToUser(daresObservable, criteria, forceServerCall)
{
var query = EntityQuery.from('Dares')
.where('statusId', '!=', enums.dareStatus.Deleted)
.where('toUserId', '==', criteria.userId)
.expand("fromUser, toUser")
.orderBy('deadlineDate, changedDate');
return dataServiceHelper.executeQuery(query, daresObservable, false, forceServerCall);
}
这是我对页面 B 的查询(单项)
function getDare(dareObservable, criteria, forceServerCall)
{
var query = EntityQuery.from('Dares')
.expand("fromUser, toUser")
.where('dareId', '==', criteria.dareId);
return dataServiceHelper.executeQuery(query, dareObservable, true, forceServerCall);
}
function executeQuery(query, itemsObservable, singleEntity, forceServerCall)
{
//check local cache first
if (!manager.metadataStore.isEmpty() && !forceServerCall)
{
var recordsInCache = executeLocalQuery(query, itemsObservable, singleEntity);
if (recordsInCache.length > 0)
{
callCompleted();
return Q.resolve();
}
}
return manager.executeQuery(query)
.then(querySucceeded)
.fail(queryFailed);
}
function executeLocalQuery(query, itemsObservable, singleEntity)
{
var recordsInCache = manager.executeQueryLocally(query);
if (recordsInCache.length > 0)
{
processQueryResults(recordsInCache, itemsObservable, singleEntity, true);
}
return recordsInCache;
}
任何建议表示赞赏...