朋友的查询失败了.幸运的是,他在失败的回调中捕获了它(你为每个服务器调用都有一个失败的回调,对吧?).这是他的所作所为:
var getPersons = function(personsObservable) {
    return EntityQuery.from('Person')
           .using(manager).execute()
           .then(querySucceeded).fail(queryFailed);
}
function queryFailed(error) {
    var msg = 'Error retreiving data. ' + error.message;
    logError(msg, error);
    throw error;
}
在error.message简单的显示JSON数据......它看起来有点像这样:
"[{"$id":"1","$type":"Person, ProjectName","Id":12,"FirstName":"Bob","LastName":"Smith","Email":"bs@contoso.com","Blog":"http://bs.contoso.com","Twitter": ..." 
WAT?
他检查了error.XHR哪个提供了用于此查询的完整AJAX XHR对象.他可以看到HTTP状态代码是200 ...这意味着服务器上的一切都很酷.他有真实数据的事实几乎说了同样的事情.
那么为什么Breeze失败了呢?他如何诊断问题?
微风可能会失败.但这个问题很有可能存在于其他地方.通常,如果Breeze失败,则会显示有意义的错误消息.此错误消息没有意义.但它确实提供了线索.
如果操作失败,则可以调用失败回调(1)或者(2)如果成功回调失败则调用失败回调.如果操作失败,则会遇到与Breeze相关的问题.如果成功回调失败,则可能存在应用程序代码问题.
要确定哪一个,在成功回调的第一行放置一个断点(在他的情况下,第一行querySucceeded).如果你点击了断点,你知道Breeze已经做到了这一点,并已交给你了.逐步完成回调,找出最有可能出错的错误,因此很容易修复.
在他的情况下,它没有得到成功的回调.因为Breeze试图从服务器中获取JSON数据中的缓存实体,所以出了点问题.那可能是什么?
有许多潜在的原因.可能是一个微风的bug.但总是最好先消除飞行员错误.你为此编写了自定义构造函数或初始化程序EntityType吗?
他做到了.他有一个初始化程序,fullName为他的计算属性添加了计算属性Person.看起来有点像这样:
metadataStore.registerEntityTypeCtor('Person', null, personInitializer);
function personInitializer(person) {
    person.fullName = ko.computed(function () {
        return entity.firstName() + ' ' + person.lastName();
    });
}
他没有看到问题.但是在诊断程序之后,他在初始化器上设置了一个断点.
果然......他有一个错字......
// "entity" does not exist. Null object error return entity.firstName() + ' ' + person.lastName();
只要他改entity到person,一切都很好.
我现在无法解释为什么空对象引用表现为消息中fail的JSON Person数据的Q promise 错误.奇怪的东西发生在JavaScript中.但线索在那里:
PersonPerson初始化器(或构造函数)阅读线索,你会知道在哪里看.
希望这个技巧可以让你远离白发和秃头.
| 归档时间: | 
 | 
| 查看次数: | 1087 次 | 
| 最近记录: |