Ошибка бриза: Незаконное строительство - используйте "или", чтобы комбинировать проверки
Я встретил эту ошибку Breeze
[Незаконное строительство - использование или совмещение чеков)
в Chrome при загрузке страницы редактирования объекта. Когда я обновляю страницу, сообщение об ошибке больше не появляется. Эта ошибка происходит случайно, нерегулярно на моем сайте. Я не мог воспроизвести его с использованием определенного сценария, просто встретив его случайным образом.
Я вижу это сообщение об ошибке внутри кода Бриза
if (curContext.prevContext === null) {
curContext.prevContext = context;
// just update the prevContext but don't change the curContext.
return that;
} else if (context.prevContext === null) {
context.prevContext = that._context;
} else {
throw new Error("Illegal construction - use 'or' to combine checks");
}
Не могли бы вы рассказать мне: на основе вышеуказанного блока кода, в каких случаях эта ошибка возникает?
Большое спасибо.
Ответы
Ответ 1
Мы немного тупицы, потому что никто не может определить, когда это произойдет.
Вы все сделаете нам одолжение и измените свой breeze.debug.js, чтобы получить больше информации о состоянии дел при его броске?
Возможно, вы можете добавить это:
} else {
console.log("** Aaargh! 'curContext.prevContext': " + curContext.prevContext +
" 'context.prevContext': " + context.prevContext);
throw new Error("Illegal construction - use 'or' to combine checks");
}
Схватывание на соломинках. Вся информация помогает.
Обновление 26 февраля 2014 г.
AHA! Спасибо @steve, @matthias и другие!
Как я лично подозревал, что-то, где-то, решил установить prevContext на undeclared
вместо null
. Я собирался рекомендовать, чтобы мы все равно переключились на "=="..., которые будут обрабатывать оба случая. Фальшивость достаточно хороша для ИМО. Мы вернемся к вам, когда мы это сделаем (предполагая, что никто из объектов команды Бриз не применяет исправление, которое мы не можем проверить).
Обновление 27 февраля 2014 г.
Я запускаю тесты DocCode с помощью breeze.min.js
в Chrome v33, и все они проходят. Разочарование. Джей проведет тесты с помощью breeze.min.js
в Chrome v33 тоже... и мы увидим, если кто-то из них потерпит неудачу. Я не надеюсь.
Я получаю ожидаемое поведение для разумных (в том числе и незаконных) вариаций parm
(undefined
, null
, true
, false
, a string
) в строке из getEntityType
, что @Маттиас упомянул
assertParam(parm, "okIfNotFound").isBoolean().isOptional().check(false);
Мой статический анализ кода (которому доверяет?) говорит мне, что первый оператор сравнения должен оставаться ===
, тогда как оператор сравнения во втором предложении может быть либо ==
, либо ===
. Автор кода много работал, чтобы убедиться, что левый операнд никогда не был undefined
на практике; мой статический анализ показывает, что он может стать undefined
... хотя я не могу устроить мир так, чтобы это произошло. Может быть, неудача воображения.
Мой статический анализ мини-кода говорит, что он корректен, хотя версия my отличается от вашей, возможно, потому, что моя минимизирована против меняющейся копии breeze.debug.js(где-то ближе к тому, что v.1.4.9 будет).
// Reformatted w/ spaces and new lines for readability.
// Observe that the minifier reversed the direction of the second null test!
// That is smart and does no harm
// I can assure you the pre-minified code is the same as what you folks are reporting.
function m(a,b) {
if(a._context){
for(var c=a._context; null!=c.prevContext;) c=c.prevContext;
if(null === c.prevContext) return c.prevContext=b, a;
if(null !== b.prevContext)
throw new Error("Illegal construction - use 'or' to combine checks");
b.prevContext=a._context
}
return n(a,b)
}
В этих трудных обстоятельствах, если мы не сможем найти неудачный тест, мы совершим прыжок веры, убей цыпленка, погренем несколько костей и изменим код на это:
if (curContext.prevContext === null) {
curContext.prevContext = context;
// just update the prevContext but don't change the curContext.
return that;
} else if (context.prevContext == null) { // CHANGED TO "if null or undefined"
context.prevContext = that._context;
} else {
throw new Error("Illegal construction - use 'or' to combine checks");
}
Если вы можете сделать время, попробуйте это в своих приложениях и убедитесь, что все в порядке.
Мы отправляем v.1.4.9 завтра (28 февраля), поэтому попробуйте этот pronto!
Ответ 2
У моей команды тоже была эта проблема. Это началось около месяца назад, но действительно увеличилось в частоте за последние 1-2 недели. Возможно, недавний хром-релиз виноват.
Вот что я знаю, все комментарии относительно ветров 1.4.1:
- Поведение прерывисто и, по-видимому, происходит случайным образом. Для меня это указывает на проблему с синхронизацией.
- Основной браузер, генерирующий эту ошибку, - хром. Мы также поддерживаем firefox и IE и не имеем конкретных доказательств того, что любой браузер, но хром, бросает эту ошибку. Возможно, недавний выпуск хром имеет другой профиль производительности, который усугубляет ранее существовавшую проблему (опять же, время?)
- Для нас, устранение связывания и минимизации, похоже, устраняет проблему. Я не думаю, что есть проблема с нашим мини-кодом (Microsoft Web Optimization), поскольку все работает независимо от других браузеров. Это для меня снова указывает на проблему с синхронизацией.
-Наконец, я просто смог воспроизвести его в моей среде разработчиков, открыв инструменты для разработчиков Chrome. Используя стек q обещаний и мучительно перемещаясь по минитипированному коду, я смог сузить его до следующего: В начале моего приложения я вызываю fetchMetadata. В обработчике успеха fetchMetadata я делаю вызов metadataStore.getEntityType('some_entity'), и именно в этом методе breeze эта ошибка генерируется в моем сценарии. Что-то с хранилищем метаданных не будет последовательно инициализировано или настроено на этом раннем этапе жизненного цикла приложения страниц.
РЕДАКТИРОВАТЬ: Из комментариев это выглядит как ошибка chrome 33, где null! == null в случайное время. По неизвестным причинам минимизация файла breeze.debug.js, по-видимому, связана (большинство/все сообщения о проблеме происходят на уменьшенной версии бриза). Для меня, изменяя следующий код в breeze.debug.js:
} else if (context.prevContext === null) {
context.prevContext = that._context;
} else {
throw new Error("Illegal construction - use 'or' to combine checks");
}
в
} else if (context.prevContext == null) {
context.prevContext = that._context;
} else {
throw new Error("Illegal construction - use 'or' to combine checks");
}
(изменение === до == в первой строке), похоже, разрешило проблему как обходной путь. Все остальные аспекты бриза отлично работают для меня после этого изменения.
Еще одна вещь, которую я заметил, состоит в том, что мини-версия функции имеет аргумент с тем же именем функции (t). Это все еще не объясняет результаты теста "Aaarg".
function t(n, t) {
if (n._context) {
for (var i = n._context; i.prevContext != null; )
i = i.prevContext;
if (i.prevContext === null)
return i.prevContext = t, n;
if (t.prevContext == null)
t.prevContext = n._context;
else
throw new Error("Illegal construction - use 'or' to combine checks");
}
return b(n, t)
}
Ответ 3
Это началось, когда Chrome обновился до версии 33. Это не произошло в Chrome 32.
Я понизил Breeze с версии 1.4.8 до версии 1.4.7, и этот исправил проблему, что проблема случалась реже.
(Единственное нарушение, указанное в changelog, заключается в том, что запросы contains
должны быть экранированы в версии 1.4.7. t21 > перед выполнением .where("yourColumn", "contains", word)
)
Edit:
Нет, переход на 1.4.7 НЕ исправил это, он просто заставлял проблему встречаться реже.
Ответ 4
Хорошо, мы только что выпустили Breeze 1.4.9 с исправлением Mathias999us. Пожалуйста, сообщите нам, исправляет ли это проблему... или нет. Спасибо Матиасу;)
Ответ 5
Взглянув на код, Бриз ожидает, что "curContext.prevContext" или "context.prevContext" будет "null". Один из них должен быть "null" в этой проверке.
Ошибка возникает, когда и curContext.prevContext и context.prevContext уже установлены в значение.
Ответ 6
Для нашего приложения переключение на не-минимизированную (отладочную) версию breeze 1.4.8 устранила ошибку. Я не могу с уверенностью сказать, что это решит проблему для всех, так как я не знаю причину проблемы или как минимизация вызывает ошибку. Возможно, ошибка может произойти с неминифицированной версией, но это не в нашем приложении.
FWIW: Исходя из нашего опыта и того, что я читал от других, ошибка характеризуется тем, что она:
- происходит только в последней версии Chrome (33) - windows и mac!
- не всегда происходит.
- похоже, имеет аспект времени. Для нас это происходит только в первых нескольких запросах бриза после запуска приложения, хотя это и не обязательно первый запрос.
- возникает для каждого запроса после первого запроса, который терпит неудачу.