考虑以下代码:
function getPersonById(personId, type) {
var p1 = new breeze.Predicate("Id", "==", personId);
var p2 = new breeze.Predicate("Type", "==", type);
var query = breeze.EntityQuery.from("Contacts").where(p1.and(p2))
if (!manager.metadataStore.hasMetadataFor(service.serviceName)) {
return manager.fetchMetadata().then(function () {
return manager.executeQuery(query.using(service));
});
} else {
var fromCache = manager.getEntityByKey('Contact', personId);
if (fromCache)
return Q.resolve(fromCache);
return manager.executeQuery(query.using(service));
}
}
我是以正确的方式做事吗?在我看来,我必须编写很多样板代码才能获取实体。我必须确保元数据已知,然后确定实体是否已在缓存中。
我遇到了一个问题,因为如果调用executeQuery,那么返回值就是一个数组。但是,如果调用getEntityByKey,则返回值为Entity。我怎样才能以优雅的方式处理这个问题?有没有办法强制executeQuery返回单个实体而不是数组? (无论如何,我只期待一个返回值)
答案 0 :(得分:1)
每个查询都不需要您的元数据测试。如果添加一个处理任何错误的失败方法(例如没有元数据),您只能编写一次,但实际上,如果您使用的是任何服务类型的JavaScript文件,则应始终存在元数据。如果您要将数据调用移动到视图模型,那么我建议您重新考虑该策略。
您进行缓存检查的方式是可选的。请记住,有两种方法可以从缓存中进行查询 - executeQueryLocally并设置fetchStrategy。在某些情况下,您需要从服务器刷新数据,因此我绝对建议您尝试在每个查询中首先从缓存中提取并仅在需要的基础上转到数据库。通常,对于每个实体,我只有两种方法用于我的所有数据检索,尽管如果你很棘手,你也可以减少这种方法来共享查询。当你可以将它们重用于不同的orderBy,where子句等时,你的查询是最有效的......
最后,如果你只想返回一个实体,那么就像它对任何其他数组一样 - 在发回它们之前捕获返回的数组结果并将其过滤为类似data.results [0]。您还可以查询然后使用过滤器来查找符合正弦条件的第一个实体。