BreezeJS在失败保存时打破Q承诺

时间:2013-03-17 19:02:56

标签: breeze q

当查询执行失败时(例如保存时数据库约束违规)我可以在控制台中看到。

  

应为空:[]

以下是示例(您可以在控制台中看到应为空:[] )):

 breeze.EntityQuery
     .from("EntityThatDoesnotExist")
     .using(new breeze.EntityManager("http://todo.breezejs.com/api/todos"))
     .execute()
     .then(function () { })
     .fail(function () { });

http://jsfiddle.net/vMhkg/3/

我是Breeze和Q的新手,所以我的问题是:我应该忽略这个吗?或者我做错了什么?或者它可能只是一个报告的错误?

2 个答案:

答案 0 :(得分:1)

其实我不认为这是一个错误。

这实际上是在没有使用done()或end()调用终止promise链的情况下Q(微风使用的promises库)的“按设计”行为。

来自此链接:https://groups.google.com/forum/#!topic/q-continuum/TfV8TIYaCpc

  

该消息应该只在浏览器中写入控制台,   第一次构建被拒绝的承诺。这是一种机制   防止未经处理的拒绝被忽视,如果发生这种情况就会发生   程序员忘记用.done()终止一连串的承诺,   .end()或.nodeify()。不幸的是,一旦消息一直存在   写入控制台,无法删除。但是,浏览器   console提供了对数组内容的生动视图。什么时候   拒绝被处理,Q从数组中删除“原因”。   因此,如果您在控制台上看到应该为空:[],则没有   错。

另外,为了完整起见,如果您要真正处理失败案例,您将在e.message中收到有意义的错误消息,即

breeze.EntityQuery
     .from("EntityThatDoesnotExist")
     .using(new breeze.EntityManager("http://todo.breezejs.com/api/todos"))
     .execute()
     .then(function () { 
        // will not get here.
     }) .fail(function (e) { 
        // e.message will contain a message something like: 
        //   No HTTP resource was found that matches the request URI  
        //   http://localhost:7149/api/NorthwindIBModel/EntityThatDoesnotExist'
});

答案 1 :(得分:0)

这是一个完整的远景。我刚刚在最近2小时内遇到了同样的错误而且很困惑。我最终调试到breeze.debug.js并发现我有一个无效的日期,我试图保存。一旦我更正了日期问题(将所有内容转换为UTC),应该为空:[]消息消失了。无论如何,我可以在第364行的Breeze中看到validateTarget方法中失败的实际验证,实际检查是在第3615行进行的。

不确定这对你是否会有所帮助,但是我只是看到同样的错误,我认为分享我的经验会很痛苦。

仅供参考,以下是我调试的验证方法以获取更多信息。

     function validateTarget(target) {
        var ok = true;
        var stype = target.entityType || target.complexType;
        var aspect = target.entityAspect || target.complexAspect;
        var entityAspect = target.entityAspect || target.complexAspect.entityAspect;

        stype.getProperties().forEach(function (p) {
            var value = target.getProperty(p.name);
            var propName = aspect.propertyPath ? aspect.propertyPath + "." + p.name : p.name;
            if (p.validators.length > 0) {
                var context = { entity: entityAspect.entity, property: p, propertyName: propName };
                ok = entityAspect._validateProperty(value, context) && ok; //This is where I put my break point to see what was actually failing.
            }
            if (p.isComplexProperty) {
                ok = validateTarget(value) && ok;
            }
        });