$scope.$apply会降低性能

5
我有一个使用AngularJS的单页面应用程序,它与服务器端交互处理传递到客户端的事件。这些事件通过ASP.NET SignalR传递到AngularJS框架中。我的应用程序可能会接收到数百万个事件,而服务器端没有性能问题,并且可以轻松地将这些事件依次传递给AngularJS框架。问题出现在客户端。在处理完事件后,我使用$scope.$apply()更新页面并显示事件。在连续接收多个事件的情况下,每次调用$scope.$apply()都会减慢应用程序的速度,并且无法快速显示事件。由于事件将随机传递,因此我甚至不知道在任何时间点上我的应用程序会接收到多少事件。
如果您有解决此问题的任何想法,将非常有帮助。
谢谢。
1个回答

5
不要使用$scope.$apply(),而应该使用$scope.$evalAsync()

从文档中可以看到:

在当前作用域下延迟执行表达式。

$evalAsync不能保证何时执行expression,但能保证:

  • 它会在调度计算表达式的函数之后执行(最好在DOM渲染之前)。
  • expression执行后,至少会执行一次$digest循环。

任何来自表达式执行的异常都将转发到$exceptionHandler服务。

注意:如果在$digest循环之外调用此函数,则会安排一个新的$digest循环。然而,建议总是在$apply调用内调用更改模型的代码。这包括通过$evalAsync评估的代码。

我还倾向于使用$scope.$safeApply()方法,该方法实际上是对$scope.$evalAsync()进行了防抖处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接