对象[对象数组]或[对象对象]没有方法'然后'

时间:2013-05-16 15:17:16

标签: breeze single-page-application

感觉就像分享这个因为它已经让我烦恼了几次而且我一直在寻找错误的区域来调试这个问题 -

我会做类似的事情 -

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'

请参阅下面的答案,了解我的想法,以及是否有其他人想要改善答案。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

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

return Q.resolve(); 

在查询完成时返回回调。