【发布时间】:2014-12-01 23:40:59
【问题描述】:
IE10 有一个问题,我可以轻松复制。在我的应用程序中通过几页弹跳后,IE 完全锁定(没有“长时间运行的脚本”警告,只是完全冻结)。我必须从任务管理器中杀死它。我已经禁用了所有附加组件,并且有一个干净的状态。我在一个相当大的工作站(Win7、16GB ram、i7、yadda yadda)上运行。
它不会在 Chrome 或 Firefox 中冻结。只有 IE10 和 IE11。
关于我的应用
我正在与工业控制系统集成以显示我的系统的活动状态。我有很多 XHR 轮询正在进行(将转移到 WebSocket,但现在,这很容易与我的 API 集成)。每 500 毫秒从端点刷新一次数据,这会更新页面上的一堆字段。
当应用程序未冻结时,浏览起来既方便又快捷。找不到导致冻结的任何特定条件。
在任何给定时间,我的应用都有 75 到 400 个 $watches(使用 this answer 计算)。
当前运行 AngularJS v1.3.0-rc.4。在 1.2.25 有类似的锁定。
那么,我的问题
我该如何调试呢?我试过让 F12 开发者工具保持打开状态,但没有任何东西输出到控制台。运行脚本分析器(Batarang 在 IE 中不可用)显示我在 $digest 中每 10 秒花费大约 200 毫秒(含)。接下来我该尝试什么?
【问题讨论】:
-
也许 Visual Studio 的分析器更好:msdn.microsoft.com/en-us/library/dd264908.aspx
-
如果您每 500 毫秒轮询一次,那么 $interval 设置/初始化控制器或服务/工厂在哪里? (我知道这与调试没有直接关系,只是一个想法)
-
@Brocco 它位于控制器包含的轮询服务中。 (我只是 $timeout 而不是 $interval 所以我确保在处理响应和开始下一个请求之间保持至少 500 毫秒的间隔)。
-
@MikeGriffith 明白了,因为每次我建议停止对销毁控制器的轮询时都会创建一个新控制器。
-
@Brocco 是的,已经确保这样做(绑定到 $scope $destroy 事件以从轮询中“取消注册”)。谢谢你的主意。我的网络活动看起来完全合理,直到 IE 冻结(此时所有 XHR 活动都停止访问服务器)。
标签: javascript jquery angularjs performance internet-explorer