itj*_*kie 13 javascript breeze
我遇到了这个Breeze错误
[非法建筑 - 使用'或'结合检查]
在加载实体的编辑页面时在Chrome上.刷新页面时,不再显示错误消息.此错误在我的网站上随机,不定期地发生.我无法使用指定的场景重现它,只是随机地遇到它.
我在Breeze代码中看到此错误消息
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");
}
Run Code Online (Sandbox Code Playgroud)
你能否告诉我:基于上面的代码块,在哪种情况下抛出这个错误?
非常感谢.
我的团队也遇到了这个问题.它开始发生在大约一个月前,但在过去的1-2周内确实增加了频率.可能是最近的铬释放归咎于此.
以下是我所知道的,与微风1.4.1相关的所有评论:
- 行为是间歇性的,似乎是随机发生的.对我来说,这表明了时间问题.
- 生成此错误的主浏览器是chrome.我们也支持firefox和IE,没有具体的证据表明任何浏览器,但chrome都会抛出此错误.也许最近发布的chrome具有不同的性能特征,这加剧了预先存在的问题(同样,时间?)
- 对我们来说,关闭捆绑和缩小似乎可以消除这个问题.我不相信我们的缩小代码(Microsoft Web Optimizations)存在问题,因为无论如何,一切都适用于其他浏览器.这对我来说再次表明了时间问题.
- 最后,我只能在我的开发环境中使用chrome开发工具打开它来重现它.使用aq promise堆栈,并痛苦地导航缩小的代码我能够将其缩小到这个:在我的应用程序启动时,我调用fetchMetadata.在fetchMetadata成功处理程序中,我调用metadataStore.getEntityType('some_entity'),并且在这个breeze方法中,在我的场景中生成错误.在页面应用程序生命周期的早期阶段,未对元数据存储进行一致的初始化或设置.
编辑:从评论,这似乎是一个chrome 33 bug,其中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");
}
Run Code Online (Sandbox Code Playgroud)
至:
} else if (context.prevContext == null) {
context.prevContext = that._context;
} else {
throw new Error("Illegal construction - use 'or' to combine checks");
}
Run Code Online (Sandbox Code Playgroud)
(在第一行更改===到==)似乎已将问题解决为解决方法.在这次改变之后,微风的所有其他方面对我来说都很好.
我注意到的另一件事是函数的缩小版本有一个与函数(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)
}
Run Code Online (Sandbox Code Playgroud)
我们有点难过,因为当发生这种情况时,没有人可以确定.
你们都帮我们一个忙吗?修改你的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");
}
Run Code Online (Sandbox Code Playgroud)
抓住稻草.所有信息都有帮助
AHA!谢谢@steve,@ matthias等人!
正如我私下怀疑的那样,某个地方已经决定将prevContext设置为undeclared而不是null.我打算建议我们切换到"=="无论如何......这将处理两种情况.FOSiness足够好IMO.当我们这样做时,我们会回复你(假设Breeze团队中没有人反对应用我们无法测试的修复).
我breeze.min.js在Chrome v33中运行我的DocCode测试,它们都通过了.令人沮丧.Jay也将breeze.min.js在Chrome v33中运行他的测试...我们将看到他们中的任何一个是否失败.我没有希望.
我得到合理的(包括非法)的变化预期的行为parm(undefined,null,true,false,一string)从线getEntityType是@Matthias提到
assertParam(parm, "okIfNotFound").isBoolean().isOptional().check(false);
Run Code Online (Sandbox Code Playgroud)
我的代码的静态分析(谁相信那?)告诉我,第一次比较运营商必须保持===,而比较操作第二子句中可以是==或===.代码作者努力确保左操作数永远不会undefined在实践中; 我的静态分析显示它可能会变成 undefined ......虽然我无法安排世界以便它发生.也许是想象力的失败.
我对缩小代码的静态分析表明它是正确的,虽然我的缩小版本与你的不同,也许是因为我的缩小版本与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)
}
Run Code Online (Sandbox Code Playgroud)
在这些艰难的情况下,除非我们能找到一个失败的测试,否则我们将实现信仰的飞跃,屠杀一只鸡,敲打一些骨头,并将代码更改为:
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");
}
Run Code Online (Sandbox Code Playgroud)
如果您可以花时间,请在您的应用中尝试此操作,并确认一切顺利.
我们明天(2月28日)发货v.1.4.9所以请试试这个!
| 归档时间: |
|
| 查看次数: |
770 次 |
| 最近记录: |