gpt4 book ai didi

javascript - 在 Breeze 实体上调用 ko.toJS 会导致脚本长时间运行缓慢

转载 作者:行者123 更新时间:2023-11-30 17:33:16 26 4
gpt4 key购买 nike

在任何具有导航属性或大型对象图的一部分的 Breeze 实体上调用 ko.toJS(entity) 时,IE7-8 会提示长时间运行的脚本错误,甚至 chrome 也会陷入困境超过 1 秒。

什么给了?!?

最佳答案

我以前也遇到过这种困扰,并且在各种论坛或 Github 问题中看到这成为开发人员的问题。我想分享一些知识,希望对其他人有所帮助。

问题

Breeze.js 为您的客户端库或框架提供对象图。在实体上调用 JSON.stringify() 将导致可怕的堆栈溢出,因为一些属性相互引用。示例 -

人 -> 公司 -> 人

由于一个人拥有公司的导航属性,而公司也具有个人的导航属性,因此他们会继续找到彼此。

ko.toJS() 通过检测重复项并在该点停止序列化来解决这个问题。

为什么会慢?

序列化需要更长的时间,具体取决于对象图中实体的数量。不相信我?加载您的应用程序并调用 ko.toJS() 然后在同一个对象图中加载更多实体。这需要更长的时间,保证。问题是,即使您对一个人调用 ko.toJS(),Knockout 也不会找到重复项,直到它序列化原始人公司中的每个人。这不是 Knockout 或 Breeze 的问题 - 这是由所有事物的互连程度造成的。

我该怎么做才能修复它?

如果可以的话,使用投影查询是最好的解决方案。问题通常是我们需要更深层次的实体嵌套,而不仅仅是当前实体。如果您的实体具有包含许多相关实体的导航属性,则没有简单的方法来执行投影查询,因此我们需要以两种方式之一更进一步 -

  1. 编写自定义序列化器

  2. Vote for IdeaBlade (the company behind Breeze.js) to support unwrapping more efficiently

我的意见 - 在实体管理器上公开一个接受以下参数的“解包”方法 -

entityManager.unwrap(entity || [entities], [addtlTypesToUnwrap])

其中 addtlTypesToUnwrap 是字符串数组或逗号分隔的字符串,用于定义要解包的相关实体类型。

示例用法 -

var thisEntity = manager.fetchEntityByKey('Person', 1, true);
var relatedProps = ['Company', 'Address']
entityManager.unwrap(thisEntity, relatedProps);

这将打开 Person、他们的地址、他们的公司和公司地址(如果存在)

关于javascript - 在 Breeze 实体上调用 ko.toJS 会导致脚本长时间运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22550560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com