使用加载的元数据执行本地查询失败

时间:2014-09-03 20:38:41

标签: breeze

我是微风的新手,这看起来像一个小虫,但我想在这里问我以防万一我不知道。

设置加载元数据:

var metadataStore = new breeze.MetadataStore();
metadataStore.importMetadata(metadata);

queryOptions = new breeze.QueryOptions( {
    fetchStrategy: breeze.FetchStrategy.FromLocalCache
});

mgr = new breeze.EntityManager({
    serviceName: 'breeze',
    metadataStore: metadataStore,
    queryOptions: queryOptions
});

明确执行本地查询:

var q = breeze.EntityQuery.from("Boards")
            .toType('Board')
            .where('isImplicit', 'equals', withImplicits)
            .orderBy('name');

return manager.executeQueryLocally(q)  // returns result

但使用query.using并不是:

var q = breeze.EntityQuery.from("Boards")
    .toType('Board')
    .where('isImplicit', 'equals', withImplicits)
    .orderBy('name');

q = q.using(breeze.FetchStrategy.FromLocalCache)

return manager.executeQuery(q)

更新:为了澄清,上面在尝试fetchMetdata并且没有要获取的端点时抛出错误。如果我修补下面的代码,它工作正常。似乎数据服务.hasServerMetadata,您不需要获取它。我正在为一个微风适配器创建测试工具,所以我希望能够在没有后端的情况下运行

在EntityManager中看起来问题是this line

    if ( (!dataService.hasServerMetadata ) || this.metadataStore.hasMetadataFor(dataService.serviceName)) {
        promise = executeQueryCore(this, query, queryOptions, dataService);
    } else {
        var that = this;
        promise = this.fetchMetadata(dataService).then(function () {
            return executeQueryCore(that, query, queryOptions, dataService);
        });
    } 

我认为行应该是if( dataService.hasServerMetadata || ...,但对于Breeze的新手,我想在开始GH问题之前问这里。

1 个答案:

答案 0 :(得分:0)

EntityManager.executeQueryLocally 是一个同步函数,您可以立即使用其结果。即。

var myEntities = myEntityManager.executeQueryLocally(myQuery);

EntityManager.executeQuery 是一个异步函数(即使查询具有指定这是本地查询的'using'调用)。所以你需要这样称呼它:

var q2 = myQuery.using(breeze.FetchStrategy.FromLocalCache);
myEntityManager.executeQuery(q2).then(function(data) {
  var myEntities = data.results;
});

这背后的想法是,使用 executeQuery ,您可以以完全相同的方式处理所有查询,即异步处理,无论它们是否实际上是异步的。

如果您想创建一个不向服务器提供元数据的EntityManager,您可以执行以下操作:

 var ds = new breeze.DataService({
   serviceName: "none",
   hasServerMetadata: false
 });

 var manager = new breeze.EntityManager({
   dataService: ds
 });