微风错误:非法施工 - 使用'或'结合检查

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)

你能否告诉我:基于上面的代码块,在哪种情况下抛出这个错误?

非常感谢.

mat*_*9us 7

我的团队也遇到了这个问题.它开始发生在大约一个月前,但在过去的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)


War*_*ard 6

我们有点难过,因为当发生这种情况时,没有人可以确定.

你们都帮我们一个忙吗?修改你的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)

抓住稻草.所有信息都有帮助

2014年2月26日更新

AHA!谢谢@steve,@ matthias等人!

正如我私下怀疑的那样,某个地方已经决定将prevContext设置为undeclared而不是null.我打算建议我们切换到"=="无论如何......这将处理两种情况.FOSiness足够好IMO.当我们这样做时,我们会回复你(假设Breeze团队中没有人反对应用我们无法测试的修复).

2014年2月27日更新

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所以请试试这个!