运行 AngularJS 网络工作者、快速计时器和 $scope.$apply() 的性能问题
Running into AngularJS performance issues with web workers, fast timers, and $scope.$apply()
我有一个以 10 毫秒为间隔在 Web Worker 中运行的计时器。每次计时器滴答作响时,都会在控制器中调用一个函数来递增一个变量。这个变量被我页面上的 bootstrap 进度条使用。
我遇到的问题是进度条不会更新,除非我在更新值的函数调用中调用 $scope.$apply()。
与此同时,我有一个数组,其中包含 $scope 上的一堆复杂对象(100 多个对象)。由于我需要调用 $scope.$apply() 以便在我的计时器每次滴答时让视图进行更改,它还会更新此对象列表(每 10 毫秒),这会减慢我的应用程序。
有没有人对我如何解决这个问题有任何想法?如果我可以提供更多详细信息,请告诉我。
如果你知道变量只需要在某个$scope
更新,你可以在那个$scope
调用$scope.$digest()
。与 $apply()
相反,$digest()
只会 运行 那个 $scope
(及其子节点)上的观察者,而不是整个应用程序。
每 10 毫秒更新一次非常频繁。如果一切正常,这将是每秒 100 次更新:大约是许多视频格式帧速率的 4 倍。一个非常简单的加快速度的方法是大大减少它。
我能想到的一种可能适合大多数架构的方法是使用节流函数,例如 lodash:
中的“_.throttle”
var throttledApply = _.throttle($scope.apply, 500);
然后当您收到一条消息时,您会看到类似的内容:
worker.onmessage = function(e) {
// ... Other processing code ...
throttledApply();
};
如果您使用的是 Bootstrap 进度条,即使它们之间的差异很大,它仍应在显示值之间提供平滑过渡。
如果 100 多个对象的元素在任何时候实际上都不是在屏幕上可见的,则您只能将屏幕上的元素包含在 DOM 中(因此只有它们的观察者)通过使用 https://github.com/kamilkp/angular-vs-repeat 之类的东西(我的一个同事不得不稍微破解它才能让它完全按照需要做:我忘记了细节)
我有一个以 10 毫秒为间隔在 Web Worker 中运行的计时器。每次计时器滴答作响时,都会在控制器中调用一个函数来递增一个变量。这个变量被我页面上的 bootstrap 进度条使用。
我遇到的问题是进度条不会更新,除非我在更新值的函数调用中调用 $scope.$apply()。
与此同时,我有一个数组,其中包含 $scope 上的一堆复杂对象(100 多个对象)。由于我需要调用 $scope.$apply() 以便在我的计时器每次滴答时让视图进行更改,它还会更新此对象列表(每 10 毫秒),这会减慢我的应用程序。
有没有人对我如何解决这个问题有任何想法?如果我可以提供更多详细信息,请告诉我。
如果你知道变量只需要在某个$scope
更新,你可以在那个$scope
调用$scope.$digest()
。与 $apply()
相反,$digest()
只会 运行 那个 $scope
(及其子节点)上的观察者,而不是整个应用程序。
每 10 毫秒更新一次非常频繁。如果一切正常,这将是每秒 100 次更新:大约是许多视频格式帧速率的 4 倍。一个非常简单的加快速度的方法是大大减少它。
我能想到的一种可能适合大多数架构的方法是使用节流函数,例如 lodash:
中的“_.throttle”var throttledApply = _.throttle($scope.apply, 500);
然后当您收到一条消息时,您会看到类似的内容:
worker.onmessage = function(e) {
// ... Other processing code ...
throttledApply();
};
如果您使用的是 Bootstrap 进度条,即使它们之间的差异很大,它仍应在显示值之间提供平滑过渡。
如果 100 多个对象的元素在任何时候实际上都不是在屏幕上可见的,则您只能将屏幕上的元素包含在 DOM 中(因此只有它们的观察者)通过使用 https://github.com/kamilkp/angular-vs-repeat 之类的东西(我的一个同事不得不稍微破解它才能让它完全按照需要做:我忘记了细节)