0

感觉喜欢分享这个,因为它已经困扰了我几次,我一直在错误的区域寻找问题来调试 -

我会做类似的事情 -

var foo = ko.observableArray();
datacontext.getFoo(foo, someId)
     .then(doSomethingElse)
     .fail(youFail);

在我的数据上下文中,我会从本地存储中返回一些东西

  var getFoo = function (fooObservable, id) {
        var query = EntityQuery.from('Foozballs')
            .where('id', '==', id)
            .orderBy('id');

        return manager.executeQueryLocally(query)
            .then(querySucceeded)
            .fail(queryFailed);
  }

并且会不断返回错误,说明

Object [Object array] has no method 'then'

请参阅下面的答案,了解我认为是什么原因造成的,以及是否有其他人想改进答案。

4

2 回答 2

1

正如提到的另一个答案,executeQueryLocally 是同步的并立即返回。如果您想查询缓存但仍使其“看起来”异步,最简单的方法是将 executeQuery 方法与 FetchStrategy.FromLocalCache一起使用。即将您的代码更改为

var getFoo = function (fooObservable, id) {
    var query = EntityQuery.from('Foozballs')
        .where('id', '==', id)
        .orderBy('id')
        .using(FetchStrategy.FromLocalCache);

    return manager.executeQuery(query)
        .then(querySucceeded)
        .fail(queryFailed);
}

请注意,这使用 executeQuery 而不是 executeQueryLocally。

于 2013-05-16T16:32:10.623 回答
0

问题是 executeQueryLocally 是同步完成的,因为它来自本地存储,因此您不能在完成时使用“then”。解决回调的正确方法是在本地执行查询然后返回

return Q.resolve(); 

在查询完成时返回回调。

于 2013-05-16T15:18:59.867 回答