Использование getter снижает производительность приложения?

Хорошо ли в контроллерах использовать геттер, не запускает ли он лишний раз цикл дайджеста ?
let services = new WeakMap;

class SomeController {
  constructor(SomeService) {
    services.set(this, SomeService);
  }
  get svcData(){
    return services.get(this).getData();
  }
}
angular.module('app').controller('SomeController', SomeController);

class SomeService {
  constructor() {
  }
  getData(){
    return [
    ...
    ...
    ]
  }
}
angular.module('app').service('SomeService', SomeService);
  • Вопрос задан
  • 213 просмотров
Пригласить эксперта
Ответы на вопрос 2
Ну, а почему должен?
Если там не происходит ничего, что триггерит дайджест - то нет.
Можете кстати проверить, манкипачнув $digest как-то так:
var oldDigest = $scope.$digest;
$scope.$digest = function() { 
    console.log('digest fired'); 
    oldDigest.call(this); 
};
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
новых циклов $digest конкретно геттер не вызывает.

В вашем же примере на каждый вызов геттера формируется абсолютно новый массив, и сравнение по ссылке он завалит. При этом сравнение это происходит на каждый $digest цикл. То есть на каждый $digest цикл (при отсутствии deep watch) будет происходить запуск ватчеров. Это единственный риск поскольку избавиться от этого можно только через deep watch а вот эта штука уже серьезно так бьет по производительности.

Ну и это не говоря о том что на каждый $digest цикл будет дергаться ваш сервис. Вместо этого стоило дергуть сервис один раз и заменять данные в контроллере только тогда когда нужно.

Если брать современные подходы, то мы вообще должны вынести все получение состояния из контроллеров (компонентов) наружу, например в ресолверы и мэпить все на проперти компонентов. Там уже геттеры/сеттеры хорошо подходят, но только те геттеры/сеттеры которые на уровне языка а не "методы". Это легче тестить, проще поддерживать и в целом открывает большой простор для дальнейшей архитектурной вакханалии.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы