调用ko.微风实体上的toJS导致脚本长时间运行缓慢
Calling ko.toJS on Breeze entity causes slow long running script
在任何具有导航属性的Breeze实体上调用ko.toJS(entity)
时,或者是大型对象图的一部分IE7-8抱怨长时间运行脚本错误,甚至chrome可以陷入困境超过1秒
给什么? ! ?
我以前有过这种困扰,看到过各种论坛或Github问题,这成为开发人员的问题。我想分享一些知识,希望能帮助别人。
Breeze.js为客户端库或框架提供对象图。在实体上调用JSON.stringify()会导致可怕的堆栈溢出,因为一些属性会相互引用。例子——
Person -> Company -> Persons
因为一个人有一个公司的导航属性,而公司也有一个人的导航属性,所以他们继续寻找彼此
ko.toJS()通过检测重复并在该点停止序列化来解决这个问题。
为什么慢?
序列化所需的时间取决于对象图中实体的数量。不相信我?加载应用程序并调用ko.toJS(),然后在同一个对象图中加载更多实体。肯定需要更长的时间。问题是,即使在单个人员上调用ko.toJS(), Knockout在序列化原始人员公司中的每个人员之前也不会找到重复的人员。这不是Knockout或Breeze的问题——它是由所有事物之间的良好互连引起的。
我能做些什么来修复它?
如果可以的话,使用投影查询是最好的解决方案。问题通常是我们需要更深层次的实体嵌套,而不仅仅是当前的实体。如果你的实体有一个导航属性,其中有许多相关的实体,那么执行投影查询就不容易了,所以我们需要采取以下两种方式之一:
-
编写自定义序列化器
-
投票给IdeaBlade (Breeze.js背后的公司)支持更有效地展开
我的意见-在实体管理器上公开一个方法'unwrap',接受以下参数-
entityManager.unwrap(entity || [entities], [addtlTypesToUnwrap])
其中addtlTypesToUnwrap是字符串数组或逗号分隔的字符串,用于定义要展开的相关实体类型。
示例用法-
var thisEntity = manager.fetchEntityByKey('Person', 1, true);
var relatedProps = ['Company', 'Address']
entityManager.unwrap(thisEntity, relatedProps);
打开Person、地址、公司和公司地址(如果存在的话)
- 为什么我的上下文选择器和.buttonset()在ie中花费了这么长时间
- 谷歌地图需要很长时间才能在ie11中渲染
- 有没有一种方法可以检查javascript以毫秒为单位执行一个函数需要多长时间
- 我一直收到的控制台警告是什么?推迟长时间运行的计时器任务以提高滚动的流畅性
- 为什么这个代码不起作用?我花了很长时间试图弄清楚这一点
- 如何在长时间执行JavaScript期间显示微调器
- 长时间轮询:每个浏览器中的通知
- 完整日历:如何支持一次点击和不长时间点击
- 如何使用 javascript 停止对 asp.net 进行正在进行的回发(长时间运行的执行)
- 如何修复长时间运行的脚本
- 长时间运行的脚本IE与Chrome/Firefox
- JavaScript 脚本执行时间太长.获取脚本需要太长时间提示
- GeckoFX:脚本占用太长时间对话框
- 使用数据表时,IE8长时间运行脚本错误
- 尽管脚本只运行了40秒(并且在此之前运行了很长时间),但在GAS中超过了最大执行时间错误
- 如何验证多长时间的JS脚本在一个网站上运行
- 用AJAX请求从客户机终止用c++编写的长时间运行的CGI脚本
- PhantomJS.Org 需要很长时间才能响应我的幻影 js 脚本
- 在操作字符串时,获得Javascript长时间运行脚本错误的机会是什么?
- 调用ko.微风实体上的toJS导致脚本长时间运行缓慢