调用ko.微风实体上的toJS导致脚本长时间运行缓慢

Calling ko.toJS on Breeze entity causes slow long running script

本文关键字:脚本 长时间 运行 缓慢 toJS 微风 ko 实体 调用      更新时间:2023-09-26

在任何具有导航属性的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的问题——它是由所有事物之间的良好互连引起的。

我能做些什么来修复它?

如果可以的话,使用投影查询是最好的解决方案。问题通常是我们需要更深层次的实体嵌套,而不仅仅是当前的实体。如果你的实体有一个导航属性,其中有许多相关的实体,那么执行投影查询就不容易了,所以我们需要采取以下两种方式之一:

  1. 编写自定义序列化器

  2. 投票给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、地址、公司和公司地址(如果存在的话)