BreezeJS нарушает обещание 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, поэтому мой вопрос: должен ли я просто игнорировать это? Или я что-то не так делаю? Или это может быть просто ошибка, чтобы сообщить?


person The Smallest    schedule 17.03.2013    source источник
comment
Изучая это сегодня. отпишусь когда исправят   -  person Jay Traband    schedule 18.03.2013


Ответы (2)


На самом деле я не думаю, что это баг.

На самом деле это «как задумано» поведение Q (библиотека обещаний, которую использует ветер) в случае, когда цепочка обещаний не завершается вызовом done() или end().

по этой ссылке: https://groups.google.com/forum/#!topic/q-continuum/TfV8TIYaCpc

Сообщение должно быть записано на консоль в браузере только при первом построении отклоненного промиса. Это механизм для предотвращения того, чтобы необработанные отказы оставались незамеченными, что может произойти, если программист забудет завершить цепочку промисов с помощью .done(), .end() или .nodeify(). К сожалению, после того, как сообщение было записано в консоль, его нельзя удалить. Однако консоль браузера обеспечивает живое представление содержимого массива. Когда отклонение обрабатывается, Q удаляет «причину» из массива. Таким образом, если вы видите сообщение Должно быть пустым: [] на вашей консоли, все в порядке.

Кроме того, в интересах полноты, если вы действительно обработаете случай сбоя, вы получите значимое сообщение об ошибке в электронном сообщении, т.е.

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'
});
person Jay Traband    schedule 18.03.2013
comment
Спасибо за ответ. Еще один вопрос: я отправил проблему на github (о расширенных свойствах, отправленных обратно на сервер), но недавно проблемы были отключены. Есть ли возможность узнать состояние этой проблемы? - person The Smallest; 19.03.2013
comment
Приносим извинения за это, мы все еще пытаемся разработать оптимальную политику для обработки этих запросов. Могу я попросить вас сделать репост вопроса здесь? и спасибо... - person Jay Traband; 19.03.2013
comment
Он был повторно опубликован: stackoverflow.com/questions/15508233/ - person The Smallest; 20.03.2013

Это полный длинный выстрел здесь. Я только что столкнулся с этой же ошибкой за последние 2 часа и был очень сбит с толку. Я закончил отладку в breeze.debug.js и обнаружил, что у меня неверная дата, которую я пытался сохранить. Как только я исправил проблему с датой (преобразовал все в UTC), сообщение Должно быть пустым: [] исчезло. Во всяком случае, я мог видеть реальную проверку, которая не удалась, в методе validateTarget в Breeze в строке 3604, фактическая проверка была выполнена в строке 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;
            }
        });
person Jay    schedule 18.03.2013
comment
Спасибо, что поделился. Так что Should be empty: [] это нехорошо, как я и думал) - person The Smallest; 18.03.2013